来自 Entity Framework 的 C# XmlSerializer
C# XmlSerializer from Entity Framework
我有2个类:
[XmlInclude(typeof(Item))]
public class A
{
public int Id { get; set; }
[XmlArray("Items")]
[XmlArrayItem("Item")]
public virtual List<Item> Items { get; set; } = new List<Item>();
}
public class Item
{
public int Id { get; set; }
[XmlIgnore]
public virtual A a { get; set; }
}
我在 DbContext
:
中使用这个方法
public virtual DbSet<A> A { get; set; }
public IQueryable<A> GetA()
{
return A;
}
现在我想导出数据到XML:
Type[] types = { typeof(Item) };
var aElements = GetA().ToList();
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(aElements.GetType(), types);
writer.Serialize(file, aElements);
它抛出一个错误:
InvalidOperationException: The type System.Data.Entity.DynamicProxies.A_08D7BCCB892E27DE8C32342A0E8F0F2B2D3B9E2DAC9F6A16 was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
怎么了?我尝试搜索类似的主题,但这些解决方案对我不起作用。
编辑:预期结果:
<A>
<Id>1</Id>
<Items>
<Item><Id>20</Id></Item>
</Items>
</A>
<A>
..
</A>
也许应该是;
public virtual DbSet<A> A{ get; set; }
public IQueryable<A> GetA()
{
return A.AsNoTracking();
}
您可能会收到此错误,因为 Entity Framework 将您的项目集合替换为项目的代理以支持延迟加载。
XmlSerializer 不期望动态生成的代理类型,因此出现错误。
您可能可以通过为该 Items 集合启用延迟加载来解决此问题 属性。请记住,通过关闭延迟加载,Items 集合将始终被填充,因此在某些情况下它可能会给您带来意想不到的性能影响。
我有2个类:
[XmlInclude(typeof(Item))]
public class A
{
public int Id { get; set; }
[XmlArray("Items")]
[XmlArrayItem("Item")]
public virtual List<Item> Items { get; set; } = new List<Item>();
}
public class Item
{
public int Id { get; set; }
[XmlIgnore]
public virtual A a { get; set; }
}
我在 DbContext
:
public virtual DbSet<A> A { get; set; }
public IQueryable<A> GetA()
{
return A;
}
现在我想导出数据到XML:
Type[] types = { typeof(Item) };
var aElements = GetA().ToList();
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(aElements.GetType(), types);
writer.Serialize(file, aElements);
它抛出一个错误:
InvalidOperationException: The type System.Data.Entity.DynamicProxies.A_08D7BCCB892E27DE8C32342A0E8F0F2B2D3B9E2DAC9F6A16 was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
怎么了?我尝试搜索类似的主题,但这些解决方案对我不起作用。
编辑:预期结果:
<A>
<Id>1</Id>
<Items>
<Item><Id>20</Id></Item>
</Items>
</A>
<A>
..
</A>
也许应该是;
public virtual DbSet<A> A{ get; set; }
public IQueryable<A> GetA()
{
return A.AsNoTracking();
}
您可能会收到此错误,因为 Entity Framework 将您的项目集合替换为项目的代理以支持延迟加载。 XmlSerializer 不期望动态生成的代理类型,因此出现错误。
您可能可以通过为该 Items 集合启用延迟加载来解决此问题 属性。请记住,通过关闭延迟加载,Items 集合将始终被填充,因此在某些情况下它可能会给您带来意想不到的性能影响。