gpt4 book ai didi

c# - 尝试更新 EF 中的类并使用通用存储库时出现 `Attaching an entity of type failed...` 异常

转载 作者:行者123 更新时间:2023-11-30 20:43:38 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 。我想加载一个实体,对其进行编辑,然后将更改保存回数据库中。但无论我编辑的是外键属性还是简单属性,EF 都会给我以下错误:

Attaching an entity of type 'ClassX' 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.

请注意 ClassX 不是我要更新的类的直接虚拟属性,而是我的类具有导航属性的其他一些类中的虚拟属性.

我读过 some related问题。但我并没有真正理解应该如何将它们应用到我自己的问题中,因为我使用的是下面发布的通用存储库。

public class GenericRepository<T>  where T : class
{
private EFDbContext context = new EFDbContext();
public IEnumerable<T> GetAll()
{
return context.Set<T>();
}
public void Insert(T entity)
{
context.Set<T>().Add(entity);
context.SaveChanges();
}
public void Update(T entity)
{
context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
//removed for brevity
}

我遇到过another problem与虚拟属性相关,我被建议使用 ViewModels 和对象到对象映射。

据我所知,有 3 个选项:

  1. 使用ViewModels 和对象到对象的映射。我不打算使用这个,因为 o2o 映射库有很多错误,这真的很痛苦。
  2. 以某种方式使用reference。但我不能这样做,因为存储库是通用的。也许我应该为此使用反射 API?
  3. 删除所有虚拟属性。这实际上是一种选择,因为他们制造的问题多于他们解决的问题。

谁能解释一下为什么会出现这个问题以及解决它的最简单方法是什么?

最佳答案

当您将实体的 State 设置为 Modified 时,它还会附加所有具有 State == EntityState.Unchanged< 的子项(由导航属性引用的实体)/。如果您的上下文中已有具有相同键的实体,则会引发该错误。

如果您希望忽略这些实体,我可以想到以下几种选择:

  1. Update 中创建一个新的数据上下文,并且不用担心子实体,因为使用 EntityState.Unchanged,当您调用 SaveChanges,它们将被忽略。如果您使用某种存储库模式,这可能没有意义。
  2. 在设置 State = EntityState.Modified 之前浏览您不想附加的导航属性并设置为 null
  3. 设置 State = EntityState.Modified 后,对于要忽略的子实体,设置 State = EntityState.Detached

编辑

最好先弄清楚为什么上下文会以具有相同键的多个子实体结束。

关于c# - 尝试更新 EF 中的类并使用通用存储库时出现 `Attaching an entity of type failed...` 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341582/

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