2017-11-26 8 views
0

私は2クラスありますEntity FrameworkのからC#のXmlSerializer

[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> 
+0

いいね。間違いはありません。あなたが提供していない別の詳細はありますか? – lucky

+0

これはほとんどすべてのものですが、これらのクラスには属性がありますが、プリミティブ型の – dontHaveName

答えて

1

Entity Frameworkがアイテムのコレクションをアイテムに置き換えて遅延読み込みをサポートするため、おそらくこのエラーが発生します。 XmlSerializerは、動的に生成されたプロキシタイプ、したがってエラーを期待しません。

これはおそらく、そのアイテムコレクションプロパティのレイジーローディングを回すことで解決できます。遅延読み込みをオフにすると、Itemsコレクションには常に値が設定されるため、場合によっては予期しないパフォーマンスの低下を招くことがあります。

+0

ええ、私はそれを理解しました。私はそれをオフにし、手動で項目を含める必要があります。そうしないと、遅延ロードのループが発生します。 – dontHaveName

0

おそらくする必要があります。

+0

が既に試されていますが、同じエラーが発生しています。私も私の質問を更新し、私はAクラスのリストをシリアライズしています。 – dontHaveName

+0

それは動作します。だから、あなたはプロキシ作成をオフにしてみますか? DbContext.Configuration.ProxyCreationEnabled = false; – lucky

+0

また、既に試してみました。エラーは発生しなくなりますが、は空です。 – dontHaveName

関連する問題