2017-09-20 2 views
0

J'ai ce scénario:Entity Framework code première clé étrangère à plusieurs à plusieurs tableau

public class Table1 
{ 
    [Key] 
    public string Table1Code { get; set; } 

    public virtual List<Table2> Table2 { get; set; } 
} 

public class Table2 
{ 
    [Key] 
    public string Table2Code { get; set; } 

    public virtual List<Table1> Table1 { get; set; }  
} 

Puis-je créer une classe de configuration pour spécifier le nombre à plusieurs tableau:

public class Table1Configuration : EntityTypeConfiguration<Table1> 
{ 
    public Table1Configuration() 
    { 
     HasMany(g => g.Table2) 
      .WithMany(r => r.Table1) 
      .Map(c => 
      { 
       c.ToTable("Table1_Table2"); 
       c.MapLeftKey("Table1Code"); 
       c.MapRightKey("Table2Code"); 
      }); 
    } 
} 

Maintenant, je doivent créer un Table3 comme celui-ci

public class Table3 
{ 
    [Key] 
    public string Table3Code { get; set; } 

    public string Table1Code { get; set; } 
    public string Table2Code { get; set; } 
} 

Comment puis-je ajouter la clé étrangère pour les colonnes Table1Code et Table2Code à la table Table1_Table2? Je n'ai pas besoin d'ajouter la clé étrangère à Table1 et Table2 mais à la table Table1_Table2.

Répondre

0

Une Relation Many2Many (M2M) comme vous avez déjà fait en utilisant EF crée une table qui a des clés qui renvoient aux tables avec des entités dans une relation M2M. Donc, suivant ce que vous avez fait dans les classes Table1 et Table2, une troisième table de mappage sera créée par EF elle-même. Il n'y a donc pas besoin particulier de créer une troisième table Table3

Mais si pour des raisons de domaine que vous souhaitez créer une troisième entité de cartographie qui Table2 cartes Table1 et Table2 vous devrez modifier les classes de la façon suivante.

public class Table1 
{ 
    [Key] 
    public string Table1Code { get; set; } 

    public virtual List<Table3> Table3 { get; set; } 
} 

public class Table2 
{ 
    [Key] 
    public string Table2Code { get; set; } 

    public virtual List<Table3> Table3 { get; set; }  
} 

public class Table3 
{ 
    [Key] 
    public string Table3Code { get; set; } 

    public Table1 Table1 { get; set; } 
    public string Table1Code { get; set; } 

    public Table2 Table2 { get; set; } 
    public string Table2Code { get; set; } 
} 
+0

Merci pour la réponse, mais je aimerait avoir le Table3 peuplé seulement avec les données de la table Table1_Table2. Dans votre réponse, le tableau 3 peut contenir des données qui ne sont pas présentes dans la table Table1_Table2 – Marco

1

Je ne sais pas, vous pouvez le faire sans une classe explicite Table1_Table2:

public class Table1_Table2 
{ 
    public string Table1Code { get; set; } // PK 1 
    public string Table2Code { get; set; } // PK 2 
    public virtual Table3 Table3 { get; set; }  
} 

Puis:

public class Table3 
{ 
    // Not needed in 1:1 
    // [Key] 
    // public string Table3Code { get; set; } 
    public string Table1Code { get; set; } 
    public string Table2Code { get; set; } 
    // Make this a collection for 1:M 
    public virtual Table1_Table2 Table1_Table2 { get; set; }  
} 

Fluent:

modelBuilder.Entity<Table3>() 
    .HasKey(t3 => new { t3.Table1Code, t3.Table2Code }); 

modelBuilder.Entity<Table1_Table2>() 
    .HasOptional(t => t.Table3) 
    .WithRequired(t3 => t3.Table1_Table2);