Entity Framework Tutorial Relations un à plusieurs
Dans une relation un-à-plusieurs, chaque ligne de données d'une table est liée à une ou plusieurs lignes de la deuxième table. C'est le type de relation le plus commun.
- Une relation un-à-plusieurs se produit lorsque la clé primaire d'une table devient des clés étrangères dans une autre table.
- La clé étrangère est définie dans la table qui représente la fin multiple de la relation.
Disons que nous avons des entités Author
et Book
.
public class Author { public int AuthorId { get; set; } public string Name { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } }
Configurer une relation un à plusieurs
Dans EF6, la plupart du temps, vous n'avez pas besoin de configurer la relation un à plusieurs car les conventions de relation un à plusieurs couvrent toutes les combinaisons. Vous pouvez établir une relation un à plusieurs à l'aide de l'une des conventions de code suivantes.
Conventions Code First
Ajouter une propriété de navigation de référence
Incluez une propriété de navigation de référence de type Author
dans la classe d'entité Book
.
public class Author { public int AuthorId { get; set; } public string Name { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public Author Author { get; set; } }
L'ajout d'une propriété de navigation Author
crée une relation un-à-plusieurs entre les tables Authors
et Books
de la base de données en ajoutant une clé étrangère Author_AuthorId
à la table Books
.
Ajouter une propriété de navigation de collection
Vous pouvez obtenir une relation un à plusieurs en ajoutant la propriété de navigation de la collection de l'entité Book
dans la classe d'entité Author
.
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public virtual ICollection<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } }
Ajouter des propriétés de navigation dans les deux entités
L'ajout de propriétés de navigation dans les deux entités entraînera également une relation un à plusieurs. Par exemple, la classe Author
contient une collection de Books
alors que la classe Book
contient une propriété de navigation de type Author
.
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public virtual ICollection<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public Author Author { get; set; } }
Relation entièrement définie
Une relation entièrement définie aux deux extrémités créera également une relation un-à-plusieurs. Par exemple, l'entité Book
inclut la propriété de clé étrangère AuthorId
avec sa propriété de référence Author
et la classe Author
contient une collection de Books
.
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public virtual ICollection<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } }
Toutes ces conventions produisent le même résultat dans la base de données.
Utilisation de l'API Fluent
Vous pouvez également configurer des relations à l'aide de l'API Fluent pour remplacer les conventions par défaut et les rendre plus faciles à gérer.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // configures one-to-many relationship modelBuilder.Entity<Book>() .HasRequired<Author>(b => b.Author) .WithMany(a => a.Books) .HasForeignKey<int>(b => b.AuthorId); }