Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Entity Framework Core : Apprendre à configurer des relations plusieurs à plusieurs avec Code First
Un billet de Hinault Romaric

Le , par Hinault Romaric

0PARTAGES

Dans les versions précédentes d’Entity Framework, pour matérialiser une relation de type plusieurs à plusieurs avec l’approche Code First, il suffisait simplement de disposer dans chaque classe entité, une propriété représentant une collection d’objets de la classe entité en lien.

Prenons par exemple les classes entités Categorie et Post ci-dessous :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Categorie 
  { 
  
       public int Id { get; set; } 
      public string Libelle { get; set; } 
      public string UrlSlug { get; set; } 
  
      public ICollection<Post> Posts { get; set; } 
  } 
  
  
 public class Post 
  { 
  
        public int Id { get; set; } 
        public string Titre { get; set; } 
        public string Contenu { get; set; } 
        public DateTime DatePublication { get; set; } 
        public TimeSpan HeurePublication { get; set; } 
        public string UrlSlug { get; set; } 
  
       public ICollection<Categorie> Categories { get; set; } 
  }

La définition de ces classes ainsi était suffisante pour qu’Entity Framework puisse matérialiser une relation de type plusieurs à plusieurs.

Cependant, si vous procédez à la génération de votre base de données en utilisant Entity Framework Core, vous obtiendrez l’erreur suivante :

Unable to determine the relationship represented by navigation property 'Categorie.Posts' of type 'ICollection'. Either manually configure the relationship, or ignore this property from the model.

Entity Framework Core n’offre pas encore un support des relations de type plusieurs à plusieurs identique à la version précédente. Pour pallier cela, vous êtes obligés de créer une classe association PostCategorie à votre modèle et procéder à deux mappages séparés un à plusieurs :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
  public class PostCategorie 
  { 
  
      public int PostId { get; set; } 
      public Post Post { get; set; } 
  
      public int CategorieId { get; set; } 
      public Categorie Categorie {get; set;}   
  }

Les classes entités Categorie et Post doivent être modifiées comme suit :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Categorie 
  { 
  
       public int Id { get; set; } 
      public string Libelle { get; set; } 
      public string UrlSlug { get; set; } 
  
      public ICollection<PostCategorie> PostCategories { get; set; } 
  } 
  
 public class Post 
  { 
  
        public int Id { get; set; } 
        public string Titre { get; set; } 
        public string Contenu { get; set; } 
        public DateTime DatePublication { get; set; } 
        public TimeSpan HeurePublication { get; set; } 
        public string UrlSlug { get; set; } 
  
       public ICollection<PostCategorie> PostCategories { get; set; } 
  
  }

Une fois cela fait, vous devez utiliser Fluent API pour Entity Framework Core pour configurer la relation et permettre de ce fait le mappage adéquat :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
        modelBuilder.Entity<PostCategrie>() 
            .HasKey(t => new { t.PostId, t.CategorieId }); 
  
        modelBuilder.Entity<PostCategrie>() 
            .HasOne(pt => pt.Post) 
            .WithMany(p => p.PostCategries) 
            .HasForeignKey(pt => pt.PostId); 
  
        modelBuilder.Entity<PostCategrie>() 
            .HasOne(pt => pt.Categorie) 
            .WithMany(t => t.PostCategries) 
            .HasForeignKey(pt => pt.CategorieId); 
    }

Cela fait, vous pouvez à nouveau générer votre base de données. Vous allez remarquer la présence de la table association avec les contraintes d’intégrité adéquates.

Une erreur dans cette actualité ? Signalez-le nous !

Contacter le responsable de la rubrique Accueil

Partenaire : Hébergement Web