gpt4 book ai didi

entity-framework - 将带有子项的 Entity Framework 对象序列化为 XML 文件

转载 作者:行者123 更新时间:2023-12-04 17:27:29 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 查询带有父/子结果集的数据,并且我想将此数据导出到 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);

这很好用,只是它只序列化父项而不在 XML 中包含相关的子记录。我怎样才能让 children 也进行序列化?

我还尝试使用 POCO 生成的代码,并且子集合尝试被序列化,除非它们是无法序列化的 ICollections。

无法序列化 System.Collections.Generic.ICollection`1[[DataSnapshots.AgreementItem, DataSnapshots, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 类型的成员 DataSnapshots.Agreement.AgreementItems,因为它是一个接口(interface)。

最佳答案

在使用 Entity Framework 实体时,XML 序列化的行为不同于二进制序列化和数据协定序列化。后者将序列化任何已加载到对象图中的相关对象,但 XML 序列化不会,因此您需要使用 DataContractSerializer :

var agreement = storeops.Agreements.SingleOrDefault(a => a.AgreementNumber == AgreementTextBox.Text);
// make sure any relations are loaded

using (XmlWriter writer = XmlWriter.Create("Agreement.xml"))
{
DataContractSerializer serializer = new DataContractSerializer(agreement.GetType());
serializer.WriteObject(writer, agreement);
}

此外,Entity Framework 默认对 1:Many 关系使用延迟加载,如果在序列化时引用的对象尚未加载,那么您将得到的只是引用它们的键。您必须通过调用 agreement.Children.Load() 显式加载相关实体或使用 .Include("Children")在您的查询中(其中 "Children" 是相关实体集合的名称)。

关于entity-framework - 将带有子项的 Entity Framework 对象序列化为 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com