不,通常这不是必需的。例如,当使用附加实体时,您可以更改 FK 属性或引用,两者都可以:
var foo = context.Foos.Include("Bar").Single(f => f.ID == 1);
然后...
foo.BarID = 5;
context.SaveChanges();
...会工作和...
var newBar = new Bar { ID = 5 };
context.Bars.Attach(newBar);
foo.Bar = newBar;
context.SaveChanges();
...也会起作用。无需取消引用。
如果您的问题中的代码可能有意义
foo
-foo.Bar
关系处于不一致/矛盾的状态
- 你知道出了什么问题
例如:
var foo = new Foo { ID = 1 };
foo.BarID = 4;
foo.Bar = new Bar { ID = 5 };
repo.UpdateFoo(foo);
并且UpdateFoo
是:
public void UpdateFoo(Foo foo)
{
context.Foos.Attach(foo); // will throw an exception
context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();
}
该Attach
行将引发异常,因为 FK 值为BarID
但4
引用foo.Bar
的是Bar
number 5
。EF 不知道什么是有效的并且会拒绝写一个更新。
您现在可以通过将问题中的代码添加到UpdateFoo
方法中来解决此问题:
public void UpdateFoo(Foo foo)
{
if (foo.Bar !=null)
{
foo.BarID = foo.Bar.ID;
foo.Bar = null; // this line is not really necessary
}
context.Foos.Attach(foo); // no exception anymore
context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();
}
但这依赖于foo.Bar
(ID = 5)有效且foo.BarID
(ID = 4)无效的假设。
通常这不一定是正确的,它可能只是相反的方式。在我看来,这个片段是一种代码异味,它试图修复存储库层中实际在另一层(业务层左右)中创建的不一致。