web-dev-qa-db-ja.com

Entity Framework 4.1 InverseProperty属性

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;}
}
37
Kamyar

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属性は関係の一方の端でのみ必要です。もう一方の端では属性を省略できます。)

80
Slauma

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は、両端で自己参照関係とペアリングナビゲーションプロパティを定義するために使用されます。チェック このサンプルの質問

28
Ladislav Mrnka