EntityFramework Même table Plusieurs à plusieurs relations

J’ai une table appelée Produits qui contient évidemment des produits. Cependant, je dois créer des produits connexes. Donc, ce que j’ai fait, c’est créer une table de jonction appelée product_related qui a deux PK. ProductID de la table Products et RelatedID également de la table Products.

J’utilise déjà EF et j’ai tout mis en place sur d’autres tables. Comment dois-je append ceci correctement afin de créer une relation avec les produits en tant que tels: product.Products.Add(product object here) . Bien sûr, ici, le product représente un object produit que j’ai récupéré depuis la firebase database en utilisant db.Products.FirstOr...

Comment dois-je le faire correctement? Beaucoup à plusieurs à la même table?

Merci.

Pour créer une relation plusieurs-à-plusieurs avec l’ approche Database-First, vous devez configurer un schéma de firebase database qui respecte certaines règles:

  • Créer une table Products avec une colonne ProductID comme clé primaire
  • Créez une table ProductRelations avec une colonne ProductID et une colonne RelatedID et marquez les deux colonnes comme clé primaire (clé composite)
  • ProductRelations aucune autre colonne à la table ProductRelations . Les deux colonnes clés doivent être les seules colonnes de la table pour permettre à EF de reconnaître cette table en tant que table de liens pour une relation plusieurs-à-plusieurs
  • Créez deux relations de clé étrangère entre les deux tables:
    • La première relation a la table Products tant que clé primaire-table avec le ProductID tant que clé primaire et la table ProductRelations tant que clé-table étrangère avec uniquement le ProductID tant que clé étrangère
    • La deuxième relation a également la table Products tant que table de clés primaire avec le ProductID tant que clé primaire et la table ProductRelations tant que table de clés étrangères avec uniquement l’ RelatedID tant que clé étrangère.
  • Activez la suppression en cascade pour la première des deux relations. (Vous ne pouvez pas le faire pour les deux. SQL Server ne l’autorisera pas car cela entraînerait plusieurs chemins de suppression en cascade.)

Si vous générez un modèle de données d’entité à partir de ces deux tables, vous n’obtiendrez plus qu’une entité , à savoir une entité Product (ou peut-être Products si vous désactivez la singularisation). La table de liens ProductRelations ne sera pas exposée en tant qu’entité.

L’entité Product aura deux propriétés de navigation :

 public EntityCollection Products { get { ... } set { ... } } public EntityCollection Products1 { get { ... } set { ... } } 

Ces collections de navigation sont les deux extrémités de la même relation plusieurs-à-plusieurs. (Si vous souhaitiez lier deux tables différentes par une relation plusieurs-à-plusieurs, par exemple, les tables A et B , une collection de navigation ( Bs ) se trouverait dans l’entité A et l’autre ( As ) serait dans l’entité B . votre relation étant “auto-référencée”, les deux propriétés de navigation se trouvent dans l’entité Product .)

La signification des deux propriétés est la suivante: les Products sont les produits liés au produit donné, les Products1 sont les produits qui se rapportent au produit donné. Par exemple: Si la relation signifie qu’un produit a besoin d’autres produits en tant que pièces à fabriquer et que vous avez les produits “Notebook”, “Processor”, “Silicon chips”, le “Processor” est constitué de “Silicon chips” (“Silicon chips “est un élément de la collection Products de l’entité produit Processor ) et est utilisé par un” Notebook “(” Notebook “est un élément de la collection Products1 de l’entité produit Processor ). Au lieu de Products et Products1 les noms MadeOf et UsedBy seraient alors plus appropriés.

Vous pouvez supprimer en toute sécurité l’une des collections du modèle généré si un seul aspect de la relation vous intéresse. Supprimez simplement par exemple Products1 dans la surface du concepteur de modèles. Vous pouvez également renommer les propriétés. La relation sera encore plusieurs à plusieurs.

modifier

Comme demandé dans un commentaire, le modèle et la correspondance avec une approche Code-First seraient les suivants:

Modèle:

 public class Product { public int ProductID { get; set; } public ICollection RelatedProducts { get; set; } } 

Cartographie:

 public class MyContext : DbContext { public DbSet Products { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(p => RelatedProducts) .WithMany() .Map(m => { m.MapLeftKey("ProductID"); m.MapRightKey("RelatedID"); m.ToTable("product_related"); }); } } 

Prenons votre exemple:

Tableau connexe

  Related_id PK Related_name Date 

Tableau des produits

  Product_id PK Related_id FK Product_Name Date 

Comment le représenter dans EF

Classe de modèle associée nommée RelatedModel

  [Key] public int Related_id { get; set; } public ssortingng Related_name {get;set} public Datetime Date{get;set;} 

Classe de modèle de produit nommée ProductModel

  [Key] public int Product_id { get; set; } public ssortingng Product_name {get;set} public ssortingng Related_id {get;set} public Datetime Date{get;set;} [ForeignKey("Related_id ")] //We can also specify here Foreign key public virtual RelatedModel Related { get; set; } 

De cette façon, nous pouvons créer des relations entre deux table

Maintenant, dans le cas de plusieurs à plusieurs relations, je voudrais prendre un autre exemple ici

Supposons que je possède une inscription de classe Model.cs

 public class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public decimal? Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } } 

Ici, CourseID et StudentId sont les deux clés étrangères

Maintenant, j’ai un autre cours Course.cs où nous allons créer plusieurs relations.

 public class Course { public int CourseID { get; set; } public ssortingng Title { get; set; } public int Credits { get; set; } public virtual ICollection Enrollments { get; set; } } 

J’espère que cela aidera !!!