Serialize Entity Framework-Objekt, mit Kindern zu XML-Datei
Ich Daten Abfrage bei Eltern/Kind-Resultsets mit Entity Framework und ich möchte diese Daten exportieren, um ein XML-Dokument.
var agreement = storeops.Agreements.SingleOrDefault(a => a.AgreementNumber == AgreementTextBox.Text);
XmlSerializer serializer = new XmlSerializer(agreement.GetType());
XmlWriter writer = XmlWriter.Create("Agreement.xml");
serializer.Serialize(writer, agreement);
Dies funktioniert gut, außer, dass es nur serialisiert die Eltern, ohne die zugehörigen untergeordneten Datensätze in der XML. Wie bekomme ich die Kinder zu serialisieren?
Ich auch versucht, mit Hilfe POCO generierten code und die untergeordneten Auflistungen versuchen, die serialisiert werden, außer Sie sind ICollections, die nicht serialisiert werden.
Nicht serialisieren Mitglied DataSnapshots.Vereinbarung.AgreementItems des Typs System.Sammlungen.Generisches.ICollection`1[[DataSnapshots.AgreementItem, DataSnapshots, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], weil es ist eine Schnittstelle.
InformationsquelleAutor Brett Mathe | 2011-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
XML-Serialisierung verhält sich anders als die binäre Serialisierung und Datenvertrag-Serialisierung bei der Arbeit mit Entity Framework-entities. Letztere serialisieren und Verwandte Objekte, die geladen wurden, in das Objekt-Diagramm, sondern die XML-Serialisierung nicht, so werden Sie brauchen, um eine
DataContractSerializer
:Auch, Entity Framework verwendet lazy loading standardmäßig für 1:Viele Beziehungen, und wenn die referenzierten Objekte noch nicht bereits geladen, wenn Sie gehen zu serialisieren, dann alles, was Sie bekommen, ist der Schlüssel, die Sie bezeichnen. Sie haben explizit laden die zugehörigen Entitäten entweder telefonisch
agreement.Children.Load()
oder mit.Include("Children")
in der Abfrage (wo"Children"
ist der name der Sammlung von verbundenen Gesellschaften).EntityCollection
ist definiert alspublic sealed class EntityCollection<TEntity> : RelatedEnd, ICollection<TEntity>, IEnumerable<TEntity>, IEnumerable, IListSource
, so dass es auf jeden Fall ist eine Sammlung.Ok, ich sehe, also warum nicht das Kind Sammlung, die serialisiert werden, in das XML-Dokument? Alle anderen Eigenschaften sind da und geladen, außer für die Kinder. Der Grund, warum ich sagen EntityCollection verhält sich nicht wie andere collecions ist, weil ich nicht Verweis die Kinder, die mit []. Ich denke, weil dieser die Kinder nicht serialisiert wird.
InformationsquelleAutor Joel C
Endlich fand ich eine Lösung für dieses, aber es erfordert die Bearbeitung der generierten Klassen 🙁
Erstellen POCO generierten entity-Klassen, set Lazy Loading zu wahren, die die Eltern und alle Kinder mit einem wählen Sie (ohne zu verwenden sind oder Last).
Auf die übergeordnete Klasse ändern Sie das Kind accessor-Typ von ICollection zu FixupCollection.
public virtual FixupCollection AgreementItemLogs
Dann in die XmlSerializer-Sie müssen geben Sie den übergeordneten Typ und untergeordnete Arten von proxy-Klassen.
XmlSerializer
nicht so funktionieren, wie Sie wollen, aber Sie können leicht mit einemDataContractSerializer
weil EF erzeugt das DataContract für Sie.InformationsquelleAutor Brett Mathe