web-dev-qa-db-fra.com

Attribut Entverse Framework 4.1 InverseProperty

Je voulais juste en savoir plus sur l'attribut RelatedTo et j'ai découvert qu'il a été remplacé par les attributs ForeignKey et 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;}
}
37
Kamyar

J'ajoute un exemple pour le InversePropertyAttribute. Il ne peut pas seulement être utilisé pour des relations dans des entités auto-référencées (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 courant:

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

... ou ...

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

Maintenant, l'ajout de l'attribut InverseProperty dans l'exemple ci-dessus est redondant: les conventions de mappage créeraient de toute façon la même relation unique.

Mais considérons 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 mappage ne détectent pas les extrémités de ces relations qui appartiennent ensemble et créent réellement quatre relations (avec quatre clés étrangères dans la table Books). Dans cette situation, l'utilisation de 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 n'obtiendrions que deux relations. (Remarque: l'attribut InverseProperty n'est nécessaire qu'à une extrémité de la relation, nous pouvons omettre l'attribut à l'autre extrémité.)

80
Slauma

ForeignKey l'attribut associe la propriété FK à la propriété de navigation. Il peut être placé sur la propriété FK ou la propriété de navigation. C'est l'équivalent de HasForeignKey mappage 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 la relation d'auto-référencement et l'association des propriétés de navigation aux deux extrémités. Vérifiez cette question pour l'échantillon .

28
Ladislav Mrnka