1

Wenn ich ein neues EF-Objekt anlege, verknüpfe ich es zuerst mit dem DbSet und setze dann eine seiner Navigationseigenschaften auf eine neue Instanz eines anderen EF-Objekts. Ich füge dann die erste EF zum DbSet hinzu und rufe Save auf. Ich erhalte die folgende Ausnahme:Entity Framework InvalidOperationException beim Speichern

System.InvalidOperationException: The changes to the database were committed 
successfully, but an error occurred while updating the object context. The 
ObjectContext might be in an inconsistent state. Inner exception message: A 
referential integrity constraint violation occurred: The property value(s) of 
'Location.Id' on one end of a relationship do not match the property value(s) 
of 'Pool.LocationId' on the other end. 

Hier ist mein Code:

ORMContext context = new ORMContext(); 

var l = context.Locations.Create(); 
context.Locations.Attach(l); 
...set properties 
context.Locations.Add(l); 

var p = context.Pools.Create(); 
context.Pools.Attach(p); 
p.Location = l; 
...set properties 
context.Pools.Add(p); 

context.SaveChanges(); 

Was ich denke, geschieht das Location Objekt ist neu und seine Id ist 0 standardmäßig. EF aktualisiert den Fremdschlüssel unter (der auf 0 festgelegt ist), und Location.Id wird aktualisiert, nachdem das Objekt Location in der Datenbank gespeichert wurde. So wird Location.Id jetzt auf den zugehörigen Wert in der Datenbank gesetzt, sagen 149, und Pool.LocationId ist immer noch auf 0 festgelegt.

Wie vermeide ich diese Ausnahme? Oder wie soll ich damit umgehen?

Antwort

2

Sie nach dem Hinzufügen der Lage speichern, auf diese Weise die Referenz auf das Unternehmen wird

ORMContext context = new ORMContext(); 

    var l = context.Locations.Create(); 
    context.Locations.Attach(l); 
    ...set properties 
    context.Locations.Add(l); 

    context.SaveChanges(); // save here, that way the location will get its Id 
    var p = context.Pools.Create(); 
    context.Pools.Attach(p); 
    p.Location = l; 
    ...set properties 
    context.Pools.Add(p); 

    context.SaveChanges(); 

eingestellt werden, dass ein Weg

+0

vereinbart würden. Das würde das Problem lösen. Dies ist jedoch keine Option. Es würde dann alle anderen Änderungen im DbContext speichern, die ich nicht erzwingen kann, bis der Benutzer auf der Benutzeroberfläche Speichern auswählt. –

Verwandte Themen