首页 > 解决方案 > 无法跟踪 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;

有效

标签: .net-coreentity-framework-core

解决方案


分离实体对象有效。

_context.Entry(obj).State = EntityState.Detached;


推荐阅读