J'ajoute un exemple pour le InversePropertyAttribute
. Il ne peut pas seulement être utilisé pour les relations dans les entités auto-référentes (comme dans l'exemple lié dans la réponse de Ladislav) mais aussi dans le cas "normal" de relations entre différentes entités :
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;}
}
Cela décrirait la même relation que ce code fluide :
modelBuilder.Entity<Book>()
.HasOptional(b => b.Author)
.WithMany(a => a.Books);
... ou ...
modelBuilder.Entity<Author>()
.HasMany(a => a.Books)
.WithOptional(b => b.Author);
Maintenant, en ajoutant le InverseProperty
dans l'exemple ci-dessus est redondant : Les conventions de mappage créeraient le même relation unique de toute façon.
Mais considérez cet exemple (d'une bibliothèque de livres qui ne contient que des livres écrits ensemble par deux auteurs) :
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;}
}
Les conventions de mise en correspondance ne permettraient pas de détecter les extrémités de ces relations et créeraient en fait quatre relations (avec quatre clés étrangères dans la table Books). Dans cette situation, l'utilisation de la méthode InverseProperty
aiderait à définir les relations correctes que nous voulons dans notre modèle :
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;}
}
Ici, nous aurions seulement deux relations . (Note : Le InverseProperty
n'est nécessaire qu'à une extrémité de la relation, nous pouvons omettre l'attribut à l'autre extrémité).