Ich versuche ein EntityObject aus einem EF4 - Datenmodel zu deserialisieren, welches vorher serialisiert worden ist. Ich verwende zu serialisieren den DataContractSerializer, da ich in dem EntityObject jede Menge Navigationseigenschaften habe.
using (XmlWriter w = XmlWriter.Create (filename, new XmlWriterSettings { Indent = true })) { ser.WriteObject (w, material); }
das läuft ohne Fehler. Sobald ich jedoch versuche aus dieser Datei wieder ein EntityObject zu erzeugen erhalte ich eine Fehlermeldung. Zuerst aber der Deserialisierungscode
using (XmlReader r = XmlReader.Create (filename)) { return type == typeof (Recipe) ? (Recipe) ser.ReadObject (r) : (Material) ser.ReadObject (r); }
hier die Fehlermeldung
System.InvalidOperationException : Eine Navigationseigenschaft, die eine EntityCollection zurückgibt, kann nicht geändert werden, wenn die vorhandene EntityCollection Elemente enthält, die sich nicht in der neuen EntityCollection befinden.
Kann mir da jemand einen Tipp geben, was ich falsch mache oder wie man dieses Problem löst?
Hi, vielleicht trifft das den Nagel auf den Kopf: Wenn du keine Attribute DataMember und IgnoreDataMember verwendest, dann versucht der Serializer alle öfftl. Properties zu serialisieren. Beim Deserialisieren versucht er demzufolge alle öfftl. Properties zu setzen. Im Zweifelsfall mit Null. Wenn Du dir den vom Designer generierten Code anschaust, dann wird bestimmt beim Setzen der NavigationProperties die Exception gewurfen. Das heißt, wenn der Deserializer versucht das Property zu setzen kommt es zu dem Fehler. Eine Lösung: Am besten kennzeichnest Du deine Klassen und Properties mit DataContract / DataMember / IgnoreDataMember Attributen. Da sich deine Entities in der Designer Klasse verstecken, wäre es sinnvoll diese dort heraus zu sezieren. Wir verwenden bei uns T4 Makros und erzeugen aus den Entities POCOS und aus dem Rest eine DBContext Klasse. (T4 Templates kannst du im Designer schon auswählen.) Die Pocos erzeugen wir in einem separaten Assembly. Das T4 Makro haben wir so angepasst, dass die DataMember / IgnoreDataMember Attribute mit generiert werden. Das Ganze geht aber auch f. Selftracking Entities etc. Bsp. kann ich gerne zukommen lassen. Grüße Ralf
Vager Tipp: Kann es sein, dass Du irgendwo ein IgnoreDataMember Attribut hast. Dann wird das Object nicht mir raus serialisiert und fehlt dann natürlich beim Deserialisieren in der Collection?