具有实体框架 6 的 ObjectContext 在现有相关实体上插入重复项

Posted

技术标签:

【中文标题】具有实体框架 6 的 ObjectContext 在现有相关实体上插入重复项【英文标题】:ObjectContext with Entity Framework 6 inserting duplicates on existing related entities 【发布时间】:2015-11-15 00:01:14 【问题描述】:

我创建它是为了希望为一些人节省一些浪费的时间,或者在我的情况下是星期六。

问题如下:

我的主要实体在这种情况下被称为 case 并且在通过验证后,我会保存到对象上下文中,就像这样

context.AddToCases(caseModel);
context.SaveChanges();

问题是案件有相关事件。我正在添加一个名为 event 的上下文感知项目,我正在像这样通过上下文查找它

caseModel.Incident = context.Incidents.SingleOrDefault(i => i.IncidentNumber == jumpIncidentNumber);

当代码运行时,我可以看到 model.Incident 有一个 EntityKey 并且状态为已添加,并且正在添加重复项。不仅如此,保存后的结论性引用是对新创建的记录。

我以为我马上就知道答案了,我只需要像这样预先通过 Attach 运行事件模型

context.Attach(incident);
caseModel.Incident = incident;

错了。虽然它的 EntityState 没有改变,但它仍然输入了一个副本。除了这一次,生成的引用是原始事件,不再是副本。

【问题讨论】:

【参考方案1】:

解决方案是像这样使用 DBContext 完全转换并覆盖 ObjectContext

if (model.Incident != null)

    DbContext dbContext = new DbContext(context, true);
    dbContext.Entry(model.Incident).State = EntityState.Unchanged;

尽管事件实体的 EntityState 未更改,但 ObjectContext 仍将其识别为新实体。 DBContext 似乎更能感知状态。

我希望这对某人有所帮助。

【讨论】:

以上是关于具有实体框架 6 的 ObjectContext 在现有相关实体上插入重复项的主要内容,如果未能解决你的问题,请参考以下文章

n 层项目中的实体框架 ObjectContext 生命周期

实体框架,具有返回类型的函数导入:无..返回 int?

实体框架和多线程

ObjectContext.SaveChanges()失败,SQL CE

实体框架,多个 edmx 共享连接字符串 - 可能吗?

每组操作的可重用 ObjectContext 还是新的 ObjectContext?