2016-05-26 15 views
0

In meinem School EF Model, habe ich Kids und Tutorials in viele-zu-viele-Beziehung. Nehmen wir an, dass sowohl Kinder als auch Tutorials bereits vorhandene Elemente enthalten. Jetzt möchten wir nur ihre bestehenden Beziehungen ändern. Das heißt, einige Tutorials von einem Kind hinzufügen/löschen.Entity Framework Aktualisieren viele bis viele Beziehungen richtig

var kid; //the request target to modify relationships 
//kid.Tutorials has the old existing relationships to be modified by add/del 
var tutorialsToAdd; //the request to add relationships 
var tutorialsToDel; //the request to del relationships 
using (var conn = new SchoolEFModels(efConnectionStr)) { 
    conn.Kids.Attach(kid); 
    kid.Tutorials.ForEach(t => conn.Tutorials.Attach(t)); 
    kid.Tutorials.AddRange(tutorialsToAdd); //simple add extension in batch 
    kid.Tutorials.RemoveRange(tutorialsToDel); //simple del extension in batch 
    conn.SaveChanges(); 
} 

Wenn ich das tue, habe ich eine Ausnahme zu sagen:

"Cannot insert duplicate key in object 'dbo.Tutorials'. The duplicate key value is (10)."

Ich kann für mich EF versucht, neue Tutorial Elemente zu erstellen, anstatt die Aktualisierung der bestehenden Beziehung sehen. Was ich nicht will. Du hast mich missverstanden EF!

Was ist falsch an meinem Code? Wie kann ich viele-zu-viele-Beziehungen aktualisieren?

+0

https://msdn.microsoft.com/en-us/magazine/dn166926.aspx –

+0

@GertArnold, es ist bis MVC Scaffolding zu verkaufen. Ich habe nicht speziell über das Many-to-Many-Update-Handling gesprochen. Meine App hat eine andere Struktur als das. So bin ich immer noch verloren :( – Tom

Antwort

0

Ich fand es heraus.

Durch das Hinzufügen/Entfernen wird EntityState auf "Hinzugefügt/Gelöscht" gesetzt. Daher, dass es bestehende Ids als den erwähnten Artikel wieder einfügt, danke Gert dort für den Link.

Also, wenn Sie jede der conn.entry(kid/tutorials).State-EntityState.Modified ändern und conn.ChangeTracker.DetectChanges(); dann conn.SaveChanges(); rufen, dann wird es nur aktualisiert die many-to-many-Tabelle wie erwartet.

UPDATE:

Eine Sache müssen Sie vorsichtig tho sein. Wenn die In-Memory-Objektliste von Kids und Tutorials miteinander verknüpft ist. z.B. Kids[0].Tutorials[0] == Tutorials[0] && Tutorial[0].Kids[0] == Kids[0] EF kann diesen Dead Loop nicht für Sie verarbeiten. Sie müssen zuerst diese kreisförmige Verbindung unterbrechen. Um dies zu tun, ist mein Ansatz, eine Verbindung zu öffnen und die Kid Out Includes (Tutorials) zu lesen, und dann das Ergebnis zu verwenden, um viele bis viele Beziehungen zu aktualisieren, aber nicht die In-Memory-Objekte zu verwenden.

Verwandte Themen