我有这样的结构
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);
一切都没有错误。但我需要使用该行。
那么,我该如何解决这个问题?
感谢
答案 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时加载,因此行为不同的原因。这也会导致额外的数据库访问。将它放入包含内容将更有效,更可预测。