Entity Framework 4.1 InverseProperty Attribute

Solo quería saber más sobre el atributo RelatedTo y descubrí que ha sido reemplazado por los atributos ForeignKey e InverseProperty en EF 4.1 RC.

¿Alguien sabe algún recurso útil sobre los escenarios que este atributo se vuelve útil?

¿Debo usar este atributo en las propiedades de navegación? ejemplo:

 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 Books {get; set;} } 

Agrego un ejemplo para InversePropertyAttribute . No solo se puede usar para relaciones en entidades autorreferenciales (como en el ejemplo vinculado en la respuesta de Ladislav) sino también en el caso “normal” de relaciones entre entidades diferentes:

 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 Books {get; set;} } 

Esto describiría la misma relación que este Código Fluido:

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

… o …

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

Ahora, agregar el atributo InverseProperty en el ejemplo anterior es redundante: las convenciones de mapeo crearían la misma relación individual de todos modos.

Pero considere este ejemplo (de una biblioteca de libros que solo contiene libros escritos por dos autores):

 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 BooksAsFirstAuthor {get; set;} public virtual ICollection BooksAsSecondAuthor {get; set;} } 

Las convenciones de mapeo no detectarían qué extremos de estas relaciones se unen y de hecho crean cuatro relaciones (con cuatro claves externas en la tabla Libros). En esta situación, usar InverseProperty ayudaría a definir las relaciones correctas que queremos en nuestro modelo:

 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 BooksAsFirstAuthor {get; set;} [InverseProperty("SecondAuthor")] public virtual ICollection BooksAsSecondAuthor {get; set;} } 

Aquí solo obtendríamos dos relaciones . (Nota: el atributo InverseProperty solo es necesario en un extremo de la relación, podemos omitir el atributo en el otro extremo).

ForeignKey atributo ForeignKey empareja la propiedad FK con la propiedad de navegación. Se puede colocar en propiedad FK o propiedad de navegación. Es equivalente HasForeignKey mapeo fluido de HasForeignKey .

 public class MyEntity { public int Id { get; set; } [ForeignKey("Navigation")] public virtual int NavigationFK { get; set; } public virtual OtherEntity Navigation { get; set; } } 

InverseProperty se usa para definir la relación de autorreferencia y las propiedades de navegación de emparejamiento en ambos extremos. Verifique esta pregunta para obtener una muestra .