37 votes

Attribut InverseProperty d'Entity Framework 4.1

Je voulais juste en savoir plus sur RelatedTo et j'ai découvert qu'il a été remplacé par ForeignKey y InverseProperty dans EF 4.1 RC.

Quelqu'un connaît-il des ressources utiles sur les scénarios dans lesquels cet attribut devient utile ?

Dois-je utiliser cet attribut sur les propriétés de navigation ? exemple :

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

80voto

Slauma Points 76561

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é).

1 votes

+1 Bien. J'espérais que vous viendriez expliquer un peu plus pour obtenir des crédits :)

7 votes

Lol ! Mais d'une certaine manière, cet attribut est dans un no-mans-land entre les conventions et le mapping Fluent : Pour les relations simples, ce n'est pas nécessaire et pour les relations complexes, tout le monde utilisera le code Fluent. C'est probablement la raison pour laquelle c'est si peu courant et la seule explication à laquelle je pense pour expliquer pourquoi même usted Je ne le savais pas :)

1 votes

Merci pour cette réponse perspicace.

28voto

Ladislav Mrnka Points 218632

ForeignKey L'attribut associe une propriété FK à une propriété de navigation. Il peut être placé soit sur la propriété FK, soit sur la propriété de navigation. Il est équivalent à HasForeignKey cartographie fluide.

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

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

    public virtual OtherEntity Navigation { get; set; }
}

InverseProperty est utilisé pour définir une relation d'auto-référencement et pour apparier les propriétés de navigation aux deux extrémités. Consultez cette question pour l'échantillon .

2 votes

Ha ! c'est encore vous ! Merci gourou EF !

0 votes

Donc, si j'ai un scénario de détail principal (EF4.2), comment dois-je décorer les propriétés (dois-je le faire) ? Disons que j'ai un Master avec une propriété virtuelle Detail:ICollection<Detail> et un Detail avec une propriété virtuelle Master .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X