【问题标题】:C# XmlSerializer from Entity Framework来自实体框架的 C# XmlSerializer
【发布时间】:2017-11-26 15:31:16
【问题描述】:

我有 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:类型 System.Data.Entity.DynamicProxies.A_08D7BCCB892E27DE8C32342A0E8F0F2B2D3B9E2DAC9F6A16 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

怎么了?我尝试搜索类似的主题,但这些解决方案对我不起作用。

编辑:预期结果:

<A>
  <Id>1</Id>
  <Items>
     <Item><Id>20</Id></Item>
  </Items>
</A>
<A>
  ..
</A>

【问题讨论】:

  • 看起来不错。没有错误。是否还有其他您未提供的详细信息?
  • 几乎所有内容,只是那些类有更多属性,但只是原始类型

标签: c# entity-framework xml-serialization


【解决方案1】:

您可能会收到此错误,因为 Entity Framework 将您的 Items 集合替换为 Items 的 Proxies 以支持延迟加载。 XmlSerializer 不需要动态生成的代理类型,因此会出现错误。

您可能可以通过为该 Items 集合属性打开延迟加载来解决此问题。请记住,通过关闭延迟加载,Items 集合将始终被填充,因此在某些情况下它可能会给您带来一些意想不到的性能影响。

【讨论】:

  • 是的,我刚刚想通了。我只需要关闭它并手动包含项目。否则会出现延迟加载循环。
【解决方案2】:

也许应该是;

public virtual DbSet<A> A{ get; set; }
public IQueryable<A> GetA()
{
      return A.AsNoTracking();
}

【讨论】:

  • 已经尝试过但同样的错误。我还更新了我的问题,我正在序列化 A 类的列表。
  • 它会起作用的。那么,您会尝试关闭代理创建。 DbContext.Configuration.ProxyCreationEnabled = false;
  • 另外,已经试过了。停止抛出错误,但 为空。
  • 也许你可以尝试深拷贝然后序列化它。
  • 此行导致该错误:public virtual A a { get;放;不过,不知道如何解决。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多