gpt4 book ai didi

c# - 更新 EF 6 中的现有数据会引发异常 - "...entity of the same type already has the same primary key value."

转载 作者:太空狗 更新时间:2023-10-29 19:49:06 26 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 6 更新记录,代码优先,没有流畅的映射或像 Automapper 这样的工具。

实体 (Employee) 具有与其关联的其他复合属性,如 Addreess(集合)、Department

它也是继承自一个名为User的基类

保存方法如下,_dbContextDbConext实现

        public bool UpdateEmployee(Employee employee)
{
var entity = _dbContext.Employees.Where(c => c.Id == employee.Id).AsQueryable().FirstOrDefault();
if (entity == null)
{
_dbContext.Employees.Add(employee);
}
else
{
_dbContext.Entry(employee).State = EntityState.Modified; // <- Exception raised here
_dbContext.Employees.Attach(employee);

}

return _dbContext.SaveChanges() > 0;

}

我不断收到错误:

Attaching an entity of type failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

我尝试了以下方法:

  1. 在设置为 EntityState.Modified 之前附加
  2. 在查询对象是否存在时添加 AsNoTracking()(无异常,但数据库未更新)- https://stackoverflow.com/a/23228001/919426
  3. 使用基本实体 _dbContext.Users 代替 Employee 实体进行保存 - https://stackoverflow.com/a/25575634/919426

现在这些都不适合我。

如果其中一些解决方案不适合我的情况,我可能犯了什么错误?

最佳答案

EF 已经包含一种无需借助 Automapper 即可映射属性的方法,假设您没有要更新的导航属性:

public bool UpdateEmployee(Employee employee)
{
var entity = _dbContext.Employees.Where(c => c.Id == employee.Id).AsQueryable().FirstOrDefault();
if (entity == null)
{
_dbContext.Employees.Add(employee);
}
else
{
_dbContext.Entry(entity).CurrentValues.SetValues(employee);
}

return _dbContext.SaveChanges() > 0;

}

这通常会生成更好的 SQL 语句,因为它只会更新已更改的属性。

如果您仍然想使用原始方法,您将从上下文中删除 entity,或者使用 AsNoTracking(不确定为什么它没有在您的情况下更新,它应该有没有效果,所以问题可能出在其他地方)或修改查询以防止它首先具体化实体,使用类似 bool exists = dbContext.Employees.Any(c => c.Id = = employee.Id) 例如。

关于c# - 更新 EF 6 中的现有数据会引发异常 - "...entity of the same type already has the same primary key value.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30691024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com