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