2011-01-03 10 views
1

Ich habe Probleme beim Speichern von Änderungen, die an meinen POCOs vorgenommen wurden, zurück in die Datenbank.POCO-Änderungen speichern

Wenn die Anwendung startet, greife ich alle Objekte, die ich brauche in POCO-Objekte, dann wenn ich auf die Schaltfläche "Speichern", ich eine neue ObjectContext-Instanz erstellen, muss ich dann die Objekte Schleife, an den Kontext anhängen und dann Änderungen erkennen und speichern.

public void SaveData() { 
     using (SolEntities sec = new SolEntities(_cxnStr)) { 
      foreach (ExtViews.Planet p in Planets) { 
       sec.CelestialBodies.Attach(p.TheBody); 
       sec.CelestialBodies.ApplyCurrentValues(p.TheBody); 
      } 
      sec.SaveChanges(SaveOptions.AcceptAllChangesAfterSave | SaveOptions.DetectChangesBeforeSave); 
     } 
    } 

Aber das scheint nicht zu funktionieren, die zwei Möglichkeiten, wie ich es an die Arbeit konnte, war entweder: A) Erstellen Sie eine lokale Liste der Planeten vor der foreach Schleife (zu zwingen, um sie von zu erzeugenden die Db vor dem Anwenden der geänderten Werte nehme ich an, und entferne die Attach Anweisung. oder B) Schalten Sie die ApplyCurrentValues Linie für diese:

sec.ObjectStateManager.ChangeObjectState(p.TheBody, System.Data.EntityState.Modified); 

aber manuell die Object zwingen für jedes Objekt modifiziert scheint ein bisschen übertrieben, vor allem, wenn sie nicht geändert haben, bin etwas halten konnte intern von ob es geändert wurde oder nicht, aber ich dachte, dass ApplyCurrentValues ​​das überhaupt tun würde?

+0

Überprüfen Sie meine Antwort hier: http://stackoverflow.com/questions/3635071/update-relationshows-saving-change-of-ef4-poco-objects/3635326#3635326 Es erklärt, warum Sie den Status für festlegen müssen jedes Objekt - wenn Sie nicht verbundene Objekte verwenden, müssen Sie die Synchronisation manuell durchführen. –

Antwort

3

Poco-Objekte können Änderungen nicht verfolgen. Nur Entity-abgeleitete Objekte können Änderungen nachverfolgen, oder Sie müssen entweder Self-Tracking-Objekte generieren oder Ihre Poco-Objekte von Ihrer benutzerdefinierten Klasse ableiten, die die Änderungen verfolgt.

Sie können für das Eigenschaftsänderungsereignis Ihres eigenen Objekts Hooks anhängen oder Code generieren, um Ihre Änderungen mit einem lokalen Repository zu speichern, das Sie leeren können, wenn Ihre Änderungen erfolgreich waren.

Verwandte Themen