2011-04-19 18 views
36

Volevo solo saperne di più sull'attributo RelatedTo e ho scoperto che è stato sostituito dagli attributi ForeignKey e InverseProperty in EF 4.1 RC.Entity Framework 4.1 InverseProperty Attribute

Qualcuno conosce qualche risorsa utile sugli scenari che questo attributo diventa utile?

Devo utilizzare questo attributo sulle proprietà di navigazione? esempio:

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

risposta

80

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

+1 Buono. Speravo che venissi a spiegarti un po 'di più per ottenere dei crediti :) –

+7

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

+1

Grazie per la risposta perspicace. – Kamyar

28

ForeignKey coppie di attributi Proprietà FK con proprietà di navigazione. Può essere posizionato su proprietà FK o proprietà di navigazione. È equivalente alla mappatura fluente HasForeignKey.

public class MyEntity 
{ 
    public int Id { get; set; } 

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

    public virtual OtherEntity Navigation { get; set; } 
} 

InverseProperty viene utilizzato per definire sé riferimento relazione e navigazione accoppiamento proprietà su entrambe le estremità. Controllare this question for sample.

+2

Ha! sei di nuovo tu! Grazie guru EF! – Kamyar

+0

Quindi, se ho uno scenario di dettaglio principale (EF4.2), cosa devo decorare le proprietà (devo farlo)? Supponiamo che io abbia una classe 'Master' con una proprietà virtuale' Dettaglio: ICollection 'e una classe' Detail' con una proprietà virtuale 'Master'. – Shimmy

Problemi correlati