1

J'utilise Entity Framework Core (EF) pour créer des modèles pour un projet.Auto-référencement de plusieurs à plusieurs relation dans Entity Framework Core

Maintenant, je veux sauver les entreprises et leur hiérarchie. J'ai donc les cas suivants:

  • une filiale (enfant) a un certain nombre d'enfants et un certain nombre de parents.
  • Une société mère a aussi un certain nombre d'enfants et un nombre quelconque de parents.

La réaction de plusieurs à plusieurs n'est pas le problème. Le vrai problème est la combinaison de plusieurs à plusieurs et l'auto-référencement (même nom de table).

Je n'ai aucune idée de comment écrire un modèle avec ces cas. J'espère que quelqu'un peut m'aider.

+0

pourquoi ne pas vous gérer M peut: M? qu'entendez-vous par 'auto-référencement (même nom de table)' – Sampath

+0

Je n'ai pas trouvé un moyen de le faire avec EF core jusqu'à présent. Avec auto-référencement (même nom de table) je veux dire que les deux entités dans la realtion (Société) sont la même table/modèle/entité – MCoder

+0

avez-vous besoin de savoir comment gérer M: M avec EF core ou autre? vous devez fournir plus d'informations. Sinon, comment pouvons-nous vous aider? Quels sont les codes de vos modèles? – Sampath

Répondre

0

à la classe modèle (passagers dans mon cas où plusieurs passagers peuvent être liés/liés à un spécifique passager ..) Définir la relation comme ci-dessous:

Passenger.cs

public int? LinkedToPassengerId { get; set; } 
[ForeignKey("LinkedToPassengerId")] 
public virtual Passenger LinkedToPassenger { get; set; } 
public virtual ICollection<Passenger> Passengers { get; set; } 

Ensuite, au DBContext classe utiliser l'API Fluent suivante pour définir le Self-Ref relation un à plusieurs dans la méthode OnModelCreating:

modelBuilder.Entity<Passenger>() <BR> 
    .HasMany(e => e.Passengers) <BR> 
    .WithOne(e => e.LinkedToPassenger) //Each passenger points back to his parent Passenger 
    .HasForeignKey(e => e.LinkedToPassengerId); 

Enfin de toute méthode de commande, vous pouvez lire les lignes liées/liées pour tout passager en utilisant les éléments suivants LINQ:

var linkPasses = new List<Passenger>(); 
var Passes = _context.Passengers.Include(c => c.Passengers).Where(m => m.ID == id); 
foreach(Passenger tmpPass in Passes) 
    foreach(Passenger tmpPass2 in tmpPass.Passengers) 
     linkPasses.Add(tmpPass2);**