.net-core - 无法跟踪 Entity Framework Core 实例,因为另一个实例
问题描述
我有一个用于 .net core 2.1 的 Web 应用程序的微服务 API,但我总是遇到这个问题。在我的服务层中,我尝试从存储库中读取一个对象。如果数据库中不存在这样的记录,我会从头开始创建并插入它。
ConfigKeyDto configKey = await _configKeyRepository.GetByKey("LAST_DEMO_ACCOUNT_ID");
if (configKey == null)
{
configKey = GetConfigKey();
await _configKeyRepository.InsertConfigKey(configKey);
}
我做了一些处理,更新了 dto 的值,然后我尝试更新它,像这样
await _configKeyRepository.UpdateConfigKey(configKey);
我最终得到了臭名昭著的“无法跟踪实体类型 'ConfigKey' 的实例,因为已经在跟踪另一个具有相同键值的 'Id' 实例”。以下是我的存储库代码:
public async Task<bool> InsertConfigKey(ConfigKeyDto configKey)
{
ConfigKey configKeyEnt = _mapper.Map<ConfigKey>(configKey);
configKeyEnt.Active = true;
configKeyEnt.CreateAt = System.DateTime.Now;
_context.Add<ConfigKey>(configKeyEnt);
await _context.SaveChangesAsync();
return true;
}
public async Task<bool> UpdateConfigKey(ConfigKeyDto configKey)
{
ConfigKey configKeyEnt = await _context.ConfigKeys.FirstOrDefaultAsync(x => x.Key == configKey.Key);
_context.Entry(configKeyEnt).State = EntityState.Modified;
_context.Entry(configKeyEnt).CurrentValues.SetValues(configKey);
await _context.SaveChangesAsync();
return true;
}
每当我必须在方法中读取/插入实体,然后再更新它时,我都曾多次偶然发现这一点。什么是正确的方法来做到这一点而不诉诸杂乱无章(比如处理上下文,或者直接使用我不喜欢的存储库层之外的数据库实体,所以我使用自动映射器)?
提前致谢
更新
我把它放在我所有的存储库方法中
_context.Entry<ConfigKey>(obj).State = EntityState.Detached;
有效
解决方案
分离实体对象有效。
_context.Entry(obj).State = EntityState.Detached;
推荐阅读
- assembly - 我想在使用循环的汇编程序中执行乘法运算
- xamarin - 构建 Xamarin.iOS 项目时 Azure DevOps Pipeline 失败
- elasticsearch - 等待elasticsearch完成bulkAsync保存
- r - 如何根据每组的现有行数在长数据集中创建新变量
- php - Show loading bar or gif while a php shell_exec runs in background
- c# - 如何保留从基本控制器收到的值用于其他方法?
- php - 如果 URL 中的单词与特定单词匹配,则返回 true/false
- html - 有没有办法为我的自定义 Keycloak 电子邮件主题添加样式?
- c++ - 而数组中的每个值都不同于特定的 int 值
- java - NavigationView 中的图标不显示