将带有子级的Entity Framework对象序列化为XML文件

| 我正在使用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中包括相关子级记录外,此方法行之有效。我如何也可以让孩子们序列化? 我还尝试使用POCO生成的代码,并且子集合尝试进行序列化,除了它们是无法序列化的ICollections。 无法序列化类型为System.Collections.Generic.ICollection`1 [[DataSnapshots.AgreementItem,DataSnapshots,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]的成员DataSnapshots.Agreement.AgreementItems,因为它是一个接口。     
已邀请:
        当使用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);
}
另外,实体框架默认情况下对1:许多关系使用延迟加载,并且如果在序列化时尚未加载被引用的对象,那么您将获得的只是引用它们的键。您必须通过调用
agreement.Children.Load()
或在查询中使用
.Include(\"Children\")
显式加载相关实体(其中
\"Children\"
是相关实体集合的名称)。     
        我终于找到了解决方案,但是它确实需要编辑生成的类:( 创建POCO生成的实体类,将“延迟加载”设置为true,这将使父级和所有子级具有一个选择(无需使用“包含”或“加载”)。 在父类上,将子访问器类型从ICollection修改为FixupCollection。 公共虚拟FixupCollection AgreementItemLogs 然后,在XmlSerializer中,您必须从代理类中指定父类型和子类型。
var agreement = storeops.Agreements.Include(\"AgreementItems\").SingleOrDefault(a => a.AgreementNumber == AgreementTextBox.Text);                                             
                var typeList = new List<Type>();

                if(agreement.AgreementItems.Count > 0)
                    typeList.Add(agreement.AgreementItems.FirstOrDefault().GetType());
                if (agreement.AgreementItemLogs.Count > 0)
                    typeList.Add(agreement.AgreementItemLogs.FirstOrDefault().GetType());
                if (agreement.AgreementPricings.Count > 0)
                    typeList.Add(agreement.AgreementPricings.FirstOrDefault().GetType());
                if (agreement.AgreementSnapshots.Count > 0)
                    typeList.Add(agreement.AgreementSnapshots.FirstOrDefault().GetType());
                if (agreement.AgreementTransactions.Count > 0)
                    typeList.Add(agreement.AgreementTransactions.FirstOrDefault().GetType());
                if (agreement.AgreementTransactionLogs.Count > 0)
                    typeList.Add(agreement.AgreementTransactionLogs.FirstOrDefault().GetType());

                XmlSerializer serializer = new XmlSerializer(agreement.GetType(), typeList.ToArray());
                XmlWriter writer = XmlWriter.Create(\"Agreement.xml\");
                serializer.Serialize(writer, agreement);
    

要回复问题请先登录注册