2017-02-16 7 views
0

Ich habe ein Problem mit dem Auffüllen der richtigen Werte in einer Junction-Tabelle für eine viele zu viele Beziehung. Im Bild unten habe ich vereinfacht, was ich versuche zu tun. Die "Tabelle links" enthält Werte in der Datenbank, die ich verwenden möchte. Die Tabelle auf der rechten Seite erhält neue Datensätze. Es hat eine Navigationseigenschaft für die Junction-Tabelle und das gleiche gilt für die Tabelle auf der linken Seite. Die Junction-Tabelle hat Navigationseigenschaften zu beiden Tabellen auf ihrer Rückseite und sie sind auf erforderliche festgelegt.Ef6, Viele zu viele, Einfügungen und Primärschlüssel

enter image description here

Wenn ich die neuen Datensätze in der Tabelle auf der rechten Seite zu erstellen, ich auch hinzufügen, um es in der Verknüpfungstabelle aufzeichnet. Die TOL_ID ist bekannt, da sie in der Datenbank gespeichert ist, aber die TOR_ID wird gerade erstellt und ist daher unbekannt. Wenn ich versuche, die SaveChanges in meinem Kontext aufzurufen, versucht es, die Junction-Tabellensätze zuerst zu speichern, bevor die TOR_IDs für den Datensatz auf der rechten Seite aufgefüllt wurden. Ich denke, dass das Markieren der Navigationseigenschaft Erforderlich dem EF verdeutlichen würde, dass TOR_ID vorhanden sein muss, bevor die Junction-Tabellenzeile erstellt wird. Stattdessen wird versucht, eine vorhandene TOL_ID und 0 einzufügen, was zu einer Verletzung führt, wenn versucht wird, viele Tabellen in die richtigen Datensätze einzufügen, die mit derselben TOL_ID verbunden sind.

Anmerkung: Speichern der TOR_IDs zuerst und dann mit Anschlusssätzen verbindet, ist keine Option, da die Erstellung der Verbindungstabellensätze Teil einer „Slowly changing dimension“ Typ 6 Strömung sind.

Dies ist, wie es wirklich aussieht in dem Code:

// The newRating is the new object corresponding the Table on the right 
var newRating = new ModuleRating() 
{ 
    // The moduleRating.RatedDriveUnit already exists in the db 
    RatedDriveUnit = moduleRating.RatedDriveUnit 
}; 

newModule.Ratings.Add(newRating); 
+0

Können Sie den Code bereitstellen, der die Datensätze verarbeitet? –

+0

@ S.Dav Ich werde es oben veröffentlichen. – Midas

+0

Sie müssen JT_ID zu TOR- und TOL-Tabellen hinzufügen. – Mehmet

Antwort

1

Wenn Sie den Code zunächst unter Klassen folgen hilfreich

public class TOL 
{ 
    [Key] 
    public int TOL_ID { get; set; } 
    public int Col1 { get; set; } 

    public ICollection<TOR> Tors { get; set; } 
} 

public class TOR 
{ 
    [Key] 
    public int TOR_ID { get; set; } 
    public int Col1 { get; set; } 

    public ICollection<TOL> Tols { get; set; } 
} 

public class TolTorContext : DbContext 
{ 
    public DbSet<TOL> Tols { get; set; } 
    public DbSet<TOR> Tors { get; set; } 
} 

Wenn Sie Datenbank ersten Ansatz folgen, Join FK bei machen Tabelle und versuchen, ID-Namen zu ändern TOLID, TORId

0

Es tut mir leid, Ihre Zeit zu verbringen. Nach einigen Nachforschungen fiel mir auf, dass der angebliche zusammengesetzte eindeutige Index (TOL_ID und TOR_ID) der Junction-Tabelle falsch gesetzt wurde. Stattdessen wurden zwei separate eindeutige Indizes auf TOL_ID und TOR_ID angewendet, was zu einer Constrain-Verletzung führte, sobald einer dieser beiden Werte zweimal auftrat.