2012-04-02 10 views
0

JavaScriptSerializerを使用してシリアル化する際に、フィールドの1つ(LinqからSQLモデル)でエラーが発生します。ScriptIgnore atributeがLinqからSQLへと動作しない

Unhandled: A circular reference was detected while serializing an object of type 'Entity.ProductType'. 

私は、ProductTypeフィールドのシリアル化を無視するようにScriptIgnore属性を設定することにしました。

public interface IProduct 
    { 
     [ScriptIgnore] 
     ProductType ProductType { get; set; } 

    } 

    [MetadataType(typeof(IProduct))] 
    public partial class Product : IProduct 
    { 
    } 

残念ながら私はまだエラーが発生しています。 ScriptIgnoreがうまくいかない理由

+0

他のフィールドはどうですか?このフィールドだけが循環参照を引き起こすことは確かですか? – everton

+0

はい、例外がエラーを与えるフィールド名を与えるためです。 – Tomas

+1

ビューモデルを使用します。ビューにドメインモデルを渡さないでください。 –

答えて

0

以下の理由により、私の会社では、我々は直接Linq2SQLエンティティをシリアル化しないことを決めた。

  1. .dbmlが再生成されるたびに、それはあなたの属性の宣言を無視し、それらをクリア。
  2. 私たちのケースでは、エンティティをビューに直接シリアル化していたので、いくつかの考えを入れました。

の理由についていくつかのポイント:我々はネットワークを経由して、それをシリアル化された場合、それはオーバーヘッドになることができるように

  • 直接直列化は、単に便利です。
  • .dbmlが変更され、追加されたプロパティによって循環的な問題が発生する可能性があることを知らなかったため、プログラマが別の作業を中断する可能性があります。それは面倒です。
  • 場合によっては、モデルを公開することは危険です。
  • 必要なプロパティだけで別のオブジェクトを公開するのはそれほど難しくありません。例:

    var person = personDAO.getById(123); 
    
    return new 
    { 
        Code = person.Id, 
        Name = person.FirstName + " " + person.LastName 
    }; 
    

ここでも、それはあなたのケースに依存します。それをあなたのビューにシリアライズしているなら、私は良い考えではないと思います。別のAppにシリアル化している場合は問題にはならないので、このようにして循環シリアル化を避けてください。

関連する問題