【问题标题】:Error in saving related objects in Entity Framework在实体框架中保存相关对象时出错
【发布时间】:2015-03-23 16:35:29
【问题描述】:

我有这样的结构

DRDLines:

 ID
 DrawingRevisionID

DrawingRevision:

 ID
 Name

它们以一对多的关系相关。

在此代码示例中

DRDLine line;

using (var db = new AMPX_DCEntities())
{                
    line = db.DRDLines.Single(p => p.ID == 1);  
    System.Console.WriteLine(line.DrawingRevision.ID);
}

using (var db = new AMPX_DCEntities())
{
    var id = 12;
    line.DrawingRevisionID = id;
}

using (var db = new AMPX_DCEntities())
{
    db.Entry(line).State = System.Data.Entity.EntityState.Modified;
    db.SaveChanges();
}

我收到此错误

发生参照完整性约束违规:关系一端的“DrawingRevision.ID”的属性值与另一端的“DRDLine.DrawingRevisionID”的属性值不匹配。

我发现:它不会更新 DRDLines 内部 DrawingRevision 中的关系

调试我看到了:

line.DrawingRevision.DRDLines[0].ID != line.DrawingRevisionID

如果我删除线

System.Console.WriteLine(line.DrawingRevision.ID);

或者这样写

System.Console.WriteLine(line.DrawingRevisionID);

一切顺利。但我需要使用那条线。

那么,我该如何解决呢?

【问题讨论】:

  • AMPX_DCEntities 是您的DbContext 派生类型吗?
  • 是的。它来自 DBContext

标签: wpf linq entity-framework runtime-error


【解决方案1】:

我的猜测是这个问题是由重复创建一个新的上下文然后处理它引起的。当您在此处设置 DrawingRevisionID 时

using (var db = new AMPX_DCEntities())
{
    var id = 12;
    line.DrawingRevisionID = id;
}

行与从中检索它的 dbcontext 分离,但未附加到您创建的新 DbContext,因此当您更改 ID 时,EF 不会连接关系。

您可以在更改 ID 之前将线对象附加回上下文

db.DRDLines.Attach(line);

这将更改两个 ID(尽管您可以手动更改另一个 ID)。由于该上下文随后被释放,您可能需要在最后一个 DbContext 会话中将 EntityState 设置为 Modified 以用于 DrawingRevision(或至少 ID 属性)。

另外,我会在原始查询中添加一个 Include 来急切地加载 DrawingRevision。目前它仅在您查询 System.Console 行上的 ID 时加载,因此行为不同。这也会导致额外的数据库访问。将其放入包含中会更有效且更可预测。

【讨论】:

  • 感谢您的宝贵时间。但这无济于事。我有很大的应用程序。因此,我获取数据供用户编辑,而不是保存它。它是程序的不同部分 - 加载和保存。所以,是的,这是不同的上下文。当我尝试附加时,我有同样的错误。是的,如果我使用 (var db = new AMPX_DCEntities()) { var id = 12; line.DrawingRevision = db.DrawingRevisions.Single(p => p.ID == id); line.DrawingRevisionID = id;它工作正常...
  • 但是我有很多实体链接到 DRDLines。因此,对它们中的每一个进行这些更改会非常痛苦......
  • @AnnaSmorodinova 没有灵丹妙药。您需要重新加载或将您需要处理的实体与当前DbContext 关联。 (改造是一项艰巨的任务,但是当您发现代码库中存在系统性缺陷时就会发生这种情况。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多