Sérialiser l'objet Entity Framework avec des enfants de fichier XML
Je suis l'interrogation de données avec le parent/enfant jeux de résultats en utilisant Entity Framework et je veux exporter ces données dans un document XML.
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);
Cela fonctionne bien sauf il ne sérialise le parent qui n'a pas compris l'enfant dans des enregistrements dans le fichier XML. Comment puis-je obtenir les enfants à sérialiser?
J'ai aussi essayé d'utiliser POCO code généré et l'enfant collections de tenter d'être sérialisé, sauf qu'ils sont ICollections qui ne peut pas être sérialisé.
Ne peut sérialiser membre DataSnapshots.D'accord.AgreementItems de type System.Les Collections.Génériques.ICollection`1[[DataSnapshots.AgreementItem, DataSnapshots, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] parce que c'est une interface.
OriginalL'auteur Brett Mathe | 2011-06-04
Vous devez vous connecter pour publier un commentaire.
La sérialisation XML se comporte différemment de la sérialisation binaire et la sérialisation de contrat de données lorsque vous travaillez avec Entity Framework entités. Ce dernier va sérialiser tout les objets qui ont été chargés dans le graphe d'objets, mais la sérialisation XML n'est pas, de sorte que vous aurez besoin d'utiliser un
DataContractSerializer
:Aussi, Entity Framework utilise le chargement différé par défaut pour 1:de Nombreuses relations, et si les objets référencés n'ont pas déjà été chargé quand vous allez à sérialiser, puis tout ce que vous obtiendrez est les touches qui s'y référer. Vous devez charger explicitement les entités liées, soit par l'appel
agreement.Children.Load()
ou en utilisant.Include("Children")
dans votre requête (où"Children"
est le nom de la collection d'entités liées).EntityCollection
est défini commepublic sealed class EntityCollection<TEntity> : RelatedEnd, ICollection<TEntity>, IEnumerable<TEntity>, IEnumerable, IListSource
, donc il a certainement est une collection.Ok, je vois que alors, pourquoi n'est-ce pas l'enfant de la collection sérialisées dans le document XML? Toutes les autres propriétés sont là et chargé, sauf pour les enfants. La raison pour laquelle je dis EntityCollection ne se comportent pas comme les autres collecions est parce que je ne peut pas référence à la enfants à l'aide de []. Je pense que de ce fait les enfants ne sont pas être sérialisé.
OriginalL'auteur Joel C
J'ai enfin trouvé une solution à cela, mais il ne nécessitent des modifications, les classes générées 🙁
Créer POCO généré les classes d'entité, jeu de Lazy Loading pour vrai qui va faire le parent et tous les enfants avec un select (sans avoir à utiliser include ou de la Charge).
Sur la classe parent modifier l'enfant accesseur type de ICollection à FixupCollection.
public virtuel FixupCollection AgreementItemLogs
Puis dans le XmlSerializer, vous devez spécifier le type parent et de l'enfant des types de classes proxy.
XmlSerializer
ne fonctionne pas de la manière que vous voulez, mais vous pouvez facilement utiliser unDataContractSerializer
parce que EF génère le DataContract pour vous.OriginalL'auteur Brett Mathe