Aggiungo un esempio per InversePropertyAttribute
. Non può essere utilizzato solo per i rapporti in entità autonome riferimento (come nell'esempio collegato in risposta di Ladislav), ma anche nel caso "normale" dei rapporti tra le diverse entità:
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;}
}
Ciò descrivere lo stesso rapporto come questo Codice Fluent:
modelBuilder.Entity<Book>()
.HasOptional(b => b.Author)
.WithMany(a => a.Books);
... o ...
modelBuilder.Entity<Author>()
.HasMany(a => a.Books)
.WithOptional(b => b.Author);
Ora, aggiungendo l'attributo InverseProperty
nell'esempio di cui sopra è redundan t: Le convenzioni di mappatura creerebbero comunque la stessa relazione .
Ma considerare questo esempio (di una libreria libro che contiene solo libri scritti insieme da due autori):
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;}
}
La mappatura convenzioni non rileverebbero che termina di queste relazioni vanno di pari passo e in realtà creare quattro relazioni (con quattro chiavi esterne nella tabella Libri). In questa situazione utilizzando il InverseProperty
contribuirebbe a definire i rapporti corretti che vogliamo nel nostro modello:
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;}
}
Qui ci sarebbe solo ottenere due relazioni. (Nota: l'attributo InverseProperty
è necessario solo su un'estremità della relazione, possiamo omettere l'attributo dall'altra parte.)
+1 Buono. Speravo che venissi a spiegarti un po 'di più per ottenere dei crediti :) –
Lol! Ma in qualche modo questo attributo è in terra di nessuno tra le convenzioni e la mappatura fluente: per le relazioni semplici non è necessario e per le relazioni complesse tutti useranno il codice Fluent.Probabilmente il motivo per cui è così raro e l'unica spiegazione mi viene in mente perché anche * tu * non lo sapevi :) – Slauma
Grazie per la risposta perspicace. – Kamyar