Durch das Konvertieren der Ansicht in Tabellen und das Speichern von Änderungen erhalte ich eine optimistische Parallelitätsausnahme

StackOverflow https://stackoverflow.com//questions/10689972

Frage

Ich arbeite mit Entity Framework 4 (unter Verwendung von Selbstverfolgungsentitäten) und greife auf eine Ansicht zu, bei der es sich um die Zusammenführung zweier Tabellen handelt.Wenn ich also die Informationen der Ansicht aktualisiere, sende ich die STE der Ansicht an das Repository, das auf die Datenbank zugreift.

Ich habe Folgendes getan:

Wenn ich meine Ansicht mit den aktualisierten Informationen erhalte, erstelle ich meine STE1 und STE2.Wenn ich eine STE erstelle, wird diese mit einem hinzugefügten Status erstellt.Da ich also für den Zustand des STE der Ansicht weiß, dass der Zustand geändert wird, ändere ich den Zustand meiner beiden STEs mit der Methode MarkedAsModified.

Wenn ich dann im STE der Ansicht die Informationen der beiden Tabellen habe, übergebe ich die Informationen aus der Ansicht an die richtige STE und wende die Änderungen von der STE auf die an objectContext.

Endlich mache ich das saveChanges.Aber in diesem Schritt erhalte ich eine Optimistic concurrency exception.Ich denke, das liegt daran, dass die STE vom Staat an den Staat weitergegeben wird Added Zu Modified Der Kontext erkennt also, dass es zwischen der Erstellung und dem eine Änderung gibt SaveChanges, aber ich versuche es auch AcceptChanges im STE, später als geändert markieren und, Änderungen anwenden und schließlich SaveChanges, aber das Problem besteht weiterhin.

Wie kann ich das Problem lösen?Gibt es eine bessere Möglichkeit, mit View und Entity Framework v4 zu arbeiten?

Danke.Daimroc.

EDIT 1:Ich habe immer noch Probleme.Mein Code ist der folgende:

Komponenten myComponent = new Components();// Dies ist ein Ste Mycomponent.Rereference = myView.Reference;...// Andere Eigenschaften myComponent.markedasModified ();//Dies ist erforderlich, da ich Informationen aktualisieren und kein neues Register hinzufügen möchte.myContext.ApplyChanges("Components", myComponent);miContexto.SaveChanges();

In den saveChanges erhalte ich die Ausnahme:Die Anweisung „update“, „insert“ oder „delete“ wirkte sich auf eine unerwartete Anzahl von Zeilen aus (0).Entitäten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden.ObjectStateManager-Einträge aktualisieren.

Was ist das Problem?Kann ich ein neu erstelltes STE nicht ändern?

Danke.

War es hilfreich?

Lösung

Ich habe den Weg gefunden, das Problem zu lösen.

Bei einer ersten Lösung bestand die Lösung darin, eine Abfrage an die Datenbank durchzuführen, um die vorhandenen Register in der Datenbank abzurufen.Dadurch werden die Entitäten im Kontext hinzugefügt und dann ist es möglich, die Daten zu ändern und die Änderungen korrekt zu speichern.

Aber später fand ich einen Weg, die Notwendigkeit zu vermeiden, die Datenbank abzufragen, um die geänderten Entitäten im Kontext hinzuzufügen.

Der Weg führt über den folgenden Code:

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

Die Lösung besteht darin, eine neue Entität zu erstellen, die den Primärschlüssel festlegt.Wenn das Unternehmen über FK verfügen würde, würde dies auf die gleiche Weise angegeben.Zu diesem Zeitpunkt hat die Entität den hinzugefügten Status.

Wird später an den Kontext angehängt und kann dann geändert werden.Wenn ein Feld geändert wird, ändert die Entität ihren Status in „Geändert“. Wenn also saveChanges() aufgerufen wird, aktualisiert EF die Entität und versucht nicht, eine neue hinzuzufügen.

Diese Informationen finde ich hier Verknüpfung.In diesem Beitrag besteht die Lösung darin, eine Entität zu löschen, ohne sie in die Datenbank abzurufen. Die Idee funktioniert jedoch auch, wenn wir ein vorhandenes Register ändern möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top