RelatedTo
属性について詳しく知りたいだけで、EF 4.1 RCではForeignKey
およびInverseProperty
属性に置き換えられていることがわかりました。
この属性が役立つシナリオに関する有用なリソースを誰かが知っていますか?
ナビゲーションプロパティでこの属性を使用する必要がありますか?例:
public class Book
{
public int ID {get; set;}
public string Title {get; set;}
[ForeignKey("FK_AuthorID")]
public Author Author {get; set;}
}
public class Author
{
public int ID {get; set;}
public string Name {get; set;}
// Should I use InverseProperty on the following property?
public virtual ICollection<Book> Books {get; set;}
}
InversePropertyAttribute
の例を追加します。 (Ladislavの回答にリンクされている例のように)自己参照エンティティの関係だけでなく、異なるエンティティ間の関係の「通常の」ケースにも使用できます。
public class Book
{
public int ID {get; set;}
public string Title {get; set;}
[InverseProperty("Books")]
public Author Author {get; set;}
}
public class Author
{
public int ID {get; set;}
public string Name {get; set;}
[InverseProperty("Author")]
public virtual ICollection<Book> Books {get; set;}
}
これは、このFluent Codeと同じ関係を表します。
modelBuilder.Entity<Book>()
.HasOptional(b => b.Author)
.WithMany(a => a.Books);
...または...
modelBuilder.Entity<Author>()
.HasMany(a => a.Books)
.WithOptional(b => b.Author);
ここで、上記の例でInverseProperty
属性を追加することは冗長です。マッピング規則により、同じ単一の関係が作成されます。
しかし、次の例を考えてみてください(2人の著者が一緒に書いた本だけを含む本のライブラリの場合):
public class Book
{
public int ID {get; set;}
public string Title {get; set;}
public Author FirstAuthor {get; set;}
public Author SecondAuthor {get; set;}
}
public class Author
{
public int ID {get; set;}
public string Name {get; set;}
public virtual ICollection<Book> BooksAsFirstAuthor {get; set;}
public virtual ICollection<Book> BooksAsSecondAuthor {get; set;}
}
マッピング規則は、これらの関係のどちらの端が一緒に属しているかを検出せず、実際に4つの関係を作成しません(Booksテーブルに4つの外部キーがあります)。この状況でInverseProperty
を使用すると、モデルに必要な正しい関係を定義するのに役立ちます。
public class Book
{
public int ID {get; set;}
public string Title {get; set;}
[InverseProperty("BooksAsFirstAuthor")]
public Author FirstAuthor {get; set;}
[InverseProperty("BooksAsSecondAuthor")]
public Author SecondAuthor {get; set;}
}
public class Author
{
public int ID {get; set;}
public string Name {get; set;}
[InverseProperty("FirstAuthor")]
public virtual ICollection<Book> BooksAsFirstAuthor {get; set;}
[InverseProperty("SecondAuthor")]
public virtual ICollection<Book> BooksAsSecondAuthor {get; set;}
}
ここでは2つの関係のみを取得します。 (注:InverseProperty
属性は関係の一方の端でのみ必要です。もう一方の端では属性を省略できます。)
ForeignKey
属性は、FKプロパティとナビゲーションプロパティをペアにします。 FKプロパティまたはナビゲーションプロパティのいずれかに配置できます。 HasForeignKey
流暢なマッピングと同等です。
public class MyEntity
{
public int Id { get; set; }
[ForeignKey("Navigation")]
public virtual int NavigationFK { get; set; }
public virtual OtherEntity Navigation { get; set; }
}
InverseProperty
は、両端で自己参照関係とペアリングナビゲーションプロパティを定義するために使用されます。チェック このサンプルの質問 。