簡體   English   中英

實體框架中的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:不應預期類型System.Data.Entity.DynamicProxies.A_08D7BCCB892E27DE8C32342A0E8F0F2B2D3B9E2DAC9F6A16。 使用XmlInclude或SoapInclude屬性可以指定靜態未知的類型。

怎么了? 我嘗試搜索類似的主題,但是這些解決方案對我不起作用。

編輯:預期結果:

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

您可能會收到此錯誤,因為Entity Framework將具有Proxies的Items集合替換為Items以支持延遲加載。 XmlSerializer不希望動態生成代理類型,因此會出現錯誤。

您可能可以通過為“項目”集合屬性打開“延遲加載”來解決此問題。 請記住,通過關閉延遲加載,將始終填充Items集合,因此在某些情況下,它可能會給您帶來一些意想不到的性能影響。

也許應該是;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM