2016-06-06 14 views
7

Sto tentando di impostare il mio database utilizzando l'API fluente di Entity Framework 7 per aggiungere una relazione molti-a-molti autoreferenziale. La classe in questione si presenta come:Creazione di una relazione Molti a Molti in Entity Framework 7

public class Definition 
{ 
    // Some properties 
    public virtual ICollection<Definition> AllowedChildDefinitions { get; set; } 
} 

dove il rapporto previsto è che ogni definizione può avere una quantità arbitraria di bambini, di qualsiasi istanza. Mi aspetterei una tabella separata con colonne genitore/figlio, in cui ogni genitore può avere più figli e ogni bambino può avere più genitori.

Esistono esempi di molti-a-molti ed esempi di tabelle autoreferenziali, ma non riesco a capire come combinare i due.

risposta

-1

Supponiamo, ad esempio, di seguire DUE Classi.

1. Definition 
2. Children 

Per relazione molti a molti, bisogna mettere ICollection classe padre nella classe figlia e mettere l'ICollection di classe figlio nella classe padre come qui di seguito.

public class Definition 
{ 
    // Some properties 
    public virtual ICollection<Children> Childrens { get; set; } 
} 

un'altra Classe (Bambini) dovrebbe avere la classe ICollection of Definition.

public class Children 
    { 
    // Some properties 
    public virtual ICollection<Definition> Definitions { get; set; } 
    } 

Nel DataContext, è necessario creare la mappatura per la nuova tabella come qui di seguito,

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<Definition>() 
      .HasMany(l => l.Childrens) 
      .WithMany(o => o.Definitions) 
      .Map(m => 
      { 
       m.MapLeftKey("DefinitionId"); 
       m.MapRightKey("ChildrenId"); 
       m.ToTable("ChildrenDefinitions"); 
      }); 
    } 

Nota: sarà avere tabella separata Creato con 2 colonne (DefinitionId, ChildrenId). E questa tabella (ChildrenDefinitions) ti consentirà di creare la relazione da molti a molti con la classe Definition e la classe Children.

Spero che questo possa aiutarti!

+2

Sfortunatamente HasMany(). WithMany() non sembra possibile in EF7, poiché l'unico metodo che può essere utilizzato sul risultato di HasMany() è WithOne(). – CoreyGrant

0

La soluzione alternativa consiste nel mappare la tabella di join a un'entità. Per favore guarda in questo.

public class Definition 
{ 
    public int Id { get; set; } 
    public ICollection<ChildrenDefinition> ChildrenDefinitions{ get; set; } 
} 

public class ChildrenDefinition 
{ 
    public int DefinitionId { get; set; } 
    public Definition Definition { get; set; } 

    public int ChildrenId { get; set; } 
    public Children Children { get; set; } 
} 

public class Children 
{ 
    public int Id { get; set; } 
    public ICollection<ChildrenDefinition> ChildrenDefinitions{ get; set; } 
} 

assicurarsi di configurare ChildrenDefinition con una chiave composta:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ChildrenDefinition>().HasKey(x => new { x.DefinitionId, x.ChildrenId }); 
} 

Per navigare, utilizzare un Select:

// Children.Definition 
var definitions = Children.ChildrenDefinitions.Select(c => c.Definition); 

Spero che questo può aiutarti!

+2

Mentre la tua risposta copre da molte a molte relazioni di base, l'OP ha chiesto di autoriferare molti a molti. Questa risposta non risolve questo tristemente – MRainzo

Problemi correlati