注釈付きクラス:
public class MyClass
{
// [Key] - Don't actually need this attribute
// EF Code First has a number of conventions.
// Columns called "Id" are assumed to be the Key.
public Guid Id {get; set; }
// This reference creates an 'Independent Association'. The Database
// foreign key is created by convention and hidden away in the code.
[Required]
public virtual OtherClass OtherClass { get; set; }
// This setup explicitly declares the foreign key property.
// Again, by convention, EF assumes that "FooId" will be the key for
// a reference to object "Foo"
// This will still be required and a cascade-on-delete property
// like above - an int? would make the association optional.
public int OtherClass2Id { get; set; }
// Leave the navigation property as this - no [Required]
public virtual OtherClass2 { get; set; }
}
だから、良いですか? Independent associationsまたはforiegnキーを宣言していますか?
独立した関連付けは、オブジェクトプログラミングに近い一致性を示します。 OOPでは、1つのオブジェクトはメンバーのIDについて本当に気にしません。 ORMはこれらの関係をさまざまな程度までカバーしています。
外部キーを宣言すると、データベースの問題がモデルに反映されますが、これによりEFの処理がはるかに簡単になるシナリオがあります。
例 - 必要な独立した関連付けでオブジェクトを更新する場合、EFはオブジェクトグラフ全体を配置したいと考えます。あなたがしたいすべてが名を更新している場合
public class MyClass
{
public int Id {get; set; }
public string Name { get; set; }
[Required] // Note the required. An optional won't have issues below.
public virtual OtherClass OtherClass { get; set; }
}
var c = db.MyClasses.Find(1);
c.Name = "Bruce Wayne";
// Validation error on c.OtherClass.
// EF expects required associations to be loaded.
db.SaveChanges();
、あなたはそれが、エンティティの検証やattach a stubbed entity (assuming you know the id)ために必要ですので、だけでなく、データベースからOtherClassをプルする必要がありますどちらか。明示的に外部キーを宣言すると、このシナリオは実行されません。
は今外部キーで、あなたは別の問題が発生した:要するに
public class MyClass
{
public Guid Id {get; set; }
public string Name { get; set; }
public int OtherClassId { get; set }
public virtual OtherClass OtherClass { get; set; }
}
var c = db.MyClasses.Find(1);
// Stepping through dubugger, here, c.OtherClassId = old id
c.OtherClass = somethingElse;
// c.OtherClassId = old id - Object and id not synced!
db.SaveChanges();
// c.OtherClassId = new id, association persists correctly though.
-
独立した団体
- グッド:マッチOOPとPOCOのより良い
- 悪い:オブジェクトグラフを更新するだけで、完全なオブジェクトグラフが必要なことがよくあります。 2つの特性。より多くのEFの頭痛。
外部キー
- グッド:時々で動作するように簡単 - レスEF頭痛。
- 悪い:あなたのPOCOの
おかげで、データベースへの懸念:そのオブジェクトと同期して