Entity Framework 4.1 InverseProperty Атрибут

Просто хотел узнать больше о RelatedTo атрибут, и я узнал, что он был заменен ForeignKey а также InverseProperty атрибуты в EF 4.1 RC.

Кто-нибудь знает какие-либо полезные ресурсы о сценариях, что этот атрибут становится полезным?

Должен ли я использовать этот атрибут в свойствах навигации? пример:

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

2 ответа

Решение

Я добавляю пример для InversePropertyAttribute, Его можно использовать не только для отношений в сущностях, на которые есть ссылки (как в примере, связанном с ответом Ладислава), но и в "нормальном" случае отношений между различными сущностями:

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

Это описало бы те же отношения, что и этот свободный код:

modelBuilder.Entity<Book>()
            .HasOptional(b => b.Author)
            .WithMany(a => a.Books);

... или же...

modelBuilder.Entity<Author>()
            .HasMany(a => a.Books)
            .WithOptional(b => b.Author);

Теперь, добавив InverseProperty атрибут в приведенном выше примере является избыточным: соглашения об отображении в любом случае будут создавать одно и то же отношение.

Но рассмотрим этот пример (из книжной библиотеки, которая содержит только книги, написанные вместе двумя авторами):

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

Соглашения о сопоставлении не определяют, какие концы этих отношений принадлежат друг другу, и фактически создают четыре отношения (с четырьмя внешними ключами в таблице Books). В этой ситуации с помощью 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;}
}

Здесь мы получили бы только два отношения. (Обратите внимание 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 используется для определения самореферентных отношений и сопряжения навигационных свойств на обоих концах. Проверьте этот вопрос для образца.

Другие вопросы по тегам