いいえ、通常は必須ではありません。たとえば、添付されたエンティティを操作する場合、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
数値であるため、この行は例外をスローします5
。EF は何が有効かを認識せず、Update の書き込みを拒否します。
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 の場合) が無効であるという前提に基づいています。
一般的に、これは必ずしも真実ではなく、逆の場合もあります。私の意見では、このスニペットは、実際には別のレイヤー (ビジネス レイヤーなど) で作成されたリポジトリ レイヤーの矛盾を修正しようとするコードの匂いです。