在Entity Framework中保存相关对象时出错

时间:2015-03-23 16:35:29

标签: wpf linq entity-framework runtime-error

我有这样的结构

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”的属性值不匹配。

我发现:它不会更新DRDLinesDrawingRevision内的关系

调试我看到了:

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

如果我删除行

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

或者像这样写

System.Console.WriteLine(line.DrawingRevisionID);

一切都没有错误。但我需要使用该行。

那么,我该如何解决这个问题?

感谢

1 个答案:

答案 0 :(得分:0)

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

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

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

您可以在更改ID

之前将线对象附加回上下文
db.DRDLines.Attach(line);

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

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