| 

.NET C# Java Javascript Exception

1
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.

var ser = new DataContractSerializer (type,
new[]
{
typeof (MaterialUsage), typeof (Element),
typeof (StandardElement),
typeof (AggregateState), typeof (MaterialType),
typeof (Discharge),
typeof (Product), typeof (OperationMode), typeof (RecipeStatus)
}, 5000, false, true, null);

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
var ser = new DataContractSerializer (type,
new[]
{
typeof (MaterialUsage), typeof (Element),
typeof (StandardElement),
typeof (AggregateState), typeof (MaterialType),
typeof (Discharge),
typeof (Product), typeof (OperationMode), typeof (RecipeStatus)
}, 5000, false, true, null);

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?

Herzlichen Dank im vorraus!!
mph
News:
14.09.2011
mph 227 1 6
2 Antworten
1
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
19.09.2011
ralf.hientzsch 637 1 7
Super! Köntest Du mir mal ein Bsp zukommen lassen? Würde echt helfen, da ich mich mit T4 überhaupt nicht auskenne.
mph 26.09.2011
0
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?
18.09.2011
ralf.hientzsch 637 1 7
Leider nein, da ich über den Designer gearbeitet habe und so keinen Einfluß auf die Erzeugung der Datendefinitionen genommen habe.
– Gast 19.09.2011

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