2017-09-20 1 views
0

Ich habe dieses Szenario:Entity Framework Code-erster Fremdschlüssel zu viele zu viele Tabellen

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; }  
} 

Dann erstelle ich eine Konfigurationsklasse für die viele zu viel Tabelle festgelegt wird:

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"); 
      }); 
    } 
} 

I Now müssen ein Table3 wie diese

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

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

erstellen Wie kann ich den Fremdschlüssel für die Spaltenhinzufügenund Table2Code in die Tabelle Table1_Table2?

Ich muss den Fremdschlüssel nicht zu Table1 und Table2 sondern zu der Tabelle Table1_Table2 hinzufügen.

Antwort

0

Eine Many2Many (M2M) -Relation, wie Sie sie bereits mit EF erstellt haben, erstellt eine Tabelle, die auf Tabellen mit Entitäten in einer M2M-Beziehung verweist.

So gehen von dem, was Sie in den Klassen getan haben Table1 und Table2 eine dritte Abbildungstabelle wird von EF selbst erstellt werden. So gibt es keine besondere Notwendigkeit, eine dritte Tabelle Table3

Aber wenn für Domain Grund erstellen möchten Sie Table2 eine dritte Umsetzungs-Einheit zu schaffen, die Table1 Karten und Table2 Sie werden die Klassen in der folgenden Art und Weise ändern müssen.

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

Danke für die Antwort, aber ich möchte die Tabelle3 nur mit gefüllt haben die Daten in der Tabelle Table1_Table2. In Ihrer Antwort kann Tabelle3 Daten enthalten, die in der Tabelle Table_Table2 nicht vorhanden sind – Marco

1

Nicht sicher, dass Sie ohne eine explizite Table1_Table2 Klasse tun können:

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

Dann:

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 Code:

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

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