| 

.NET C# Java Javascript Exception

2
Ich habe einen Customer der keine Reservierungen hat. Nun füge ich eine Reservierung hinzu. Jetzt würde ich erwarten das der EntityState für den Customer "Modified" ist. Dies ist allerdings nicht der Fall.

Dennoch scheint entities.SaveChanges() dem Customer in der DB erfolgreich eine reservation hinzugefügt zu haben.

Aber woran erkennt das System die Änderungen um sie dann entsprechend per SaveChanges wegzuschreiben?

bzw.: Wie kann ich diese Art von Änderung erkennen wenn nicht anhand von EntityState?

var entities = new BreakAwayEntities();
var customer = entities.Customers.First(p=>p.ContactID == 1);
var res = entities.Reservations.First();

Console.WriteLine(customer.Reservations.Count); //0
customer.Reservations.Add(res);
Console.WriteLine(customer.Reservations.Count); //1
Console.WriteLine(customer.EntityState); //Unchanged
06.04.2011
Thomas Sczyrba 1,4k 1 2 9
3 Antworten
2
Das customer Objekt verändert sich ja nicht, deswegen bleibt sein Status auch. Du könntest dir die Anzahl der hinzugefügten Datensätze zurückgeben lassen:

entities.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count()
06.04.2011
m.fuchs 1,8k 2 8
Ja ich denke das führt mich näher an die Lösung. GetObjectStateEntries liefert mir einen Eintrag. Die Frage ist jetzt nur noch wie ich herausbekomme auf welchen Customer bzw. Reservation sich dieser Eintrag bezieht?!
Thomas Sczyrba 06.04.2011
Da bin ich mir nicht ganz sicher. Probier mal dich mit dem RelationshipManager zu befassen. Jeder ObjectStateEntry aus der obigen Abfrage liefert einen mit. Das sollte dir eigentlich helfen die verknüpften Objekte zu ermitteln.
m.fuchs 07.04.2011
1
Zusätzlich zur Antwort von m.fuchs möchte ich zur Erklärung noch auf diese Seite verweisen: Using DbContext in EF 4.1 Part 4: Add/Attach and Entity States
06.04.2011
Jürgen Luhr 7,1k 2 9
Danke für den Hinweis... leider muss ich mich momentan noch auf die EF V 1 konzentrieren.
Thomas Sczyrba 06.04.2011
0
Mir ist noch etwas eingefallen. Du könntest auch deine customer Klasse erweitern um eine entsprechende Prüfmethode (auf die Schnelle nur in VB.NET):
Public Function ChildsModified() As Boolean
For Each child In Reservations
If Not child.EntityState = Data.EntityState.Unchanged Then
Return True
End If
Next
Return False
End Function

Dann kannst du damit problemlos prüfen ob ein Element hinzukam, gelöscht oder verändert wurde.
06.04.2011
m.fuchs 1,8k 2 8
Das wäre auch eine Möglichkeit. Das müsste ich dann allerdings in jede Entität nachpflegen. Bitte schau dir mal die Frage in dem Kommentar zu deiner letzten Antwort an.
Thomas Sczyrba 07.04.2011
Betrifft das so viele Entitäten bei dir? Bin jetzt erstmal nur von der customer-Klasse ausgegangen. Was bezweckst du eigentlich mit dieser Ermittlung, vielleicht geht es ja auch ganz anders/einfacher.
m.fuchs 07.04.2011
Vom Prizip her will ich wissen welche entität in meinem DataContext verändert wurde... Bei Änderungen innherhalb von Entitäten kein problem. Sobald es allerdings mit Relations zu tun hat muss ich ein anderes Verfahren anwenden
Thomas Sczyrba 07.04.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH