2011-02-06 18 views
4

Entity Framework経由で取得しているエンティティがあります。私はCode-Firstを使っていますので、彼らはPOCOです。私はXmlSerializerをを使用してそれらをシリアライズXMLにしようとすると、私は次のエラーを取得する:Entity Frameworkオブジェクトをシリアル化しようとするとXMLシリアル化エラーが発生する

The type System.Data.Entity.DynamicProxies.Song_C59F4614EED1B7373D79AAB4E7263036C9CF6543274A9D62A9D8494FB01F2127 was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

誰もが(まったく新しいオブジェクトを作成するための短い)これを回避する方法上の任意のアイデアを得ましたか。

答えて

6

ちょうどPOCOが(特にこの場合、プロキシを使用しているように見えるので)本当に役に立たないと言ってください。プロキシは多くの場合に便利ですが、シリアル化される実際のオブジェクトは実際にオブジェクトではなくプロキシのインスタンスであるため、シリアル化のようなことをより困難にします。

このブログ記事はあなたに答えを与えるはずです。 http://blogs.msdn.com/b/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx

5

申し訳ありませんが、私は(数年後半)このビット後半に来て知っているが、あなたが遅延読み込みのためのプロキシオブジェクトを必要としない場合は、あなたがこれを行うことができます:

Configuration.ProxyCreationEnabled = false; 
をコンテキスト内の

私の魅力のように働いた。 Shiv Kumarは実際になぜより良い見通しを提供しますが、少なくともこれはあなたを仕事に戻すでしょう(あなたがプロキシーを必要としないと仮定して)。

0

データベース構成とは独立して動作する別の方法は、オブジェクトの深いクローンを作成することです。

私はこのコードを最初のEFプロジェクトにAutomapper(https://www.nuget.org/packages/AutoMapper/)を使用しています。次に、 'IonPair'というEFオブジェクトのリストをエクスポートするサンプルコードを示します。

 public bool ExportIonPairs(List<IonPair> ionPairList, string filePath) 
    { 
     Mapper.CreateMap<IonPair, IonPair>();      //creates the mapping 
     var clonedList = Mapper.Map<List<IonPair>>(ionPairList); // deep-clones the list. EF's 'DynamicProxies' are automatically ignored. 
     var ionPairCollection = new IonPairCollection { IonPairs = clonedList }; 
     var serializer = new XmlSerializer(typeof(IonPairCollection)); 

     try 
     { 
      using (var writer = new StreamWriter(filePath)) 
      { 
       serializer.Serialize(writer, ionPairCollection); 
      } 
     } 
     catch (Exception exception) 
     { 
      string message = string.Format(
       "Trying to export to the file '{0}' but there was an error. Details: {1}", 
       filePath, exception.Message); 

      throw new IOException(message, exception); 
     } 

     return true; 
    } 
関連する問題