2011-01-21 2 views
12

EF4 CTP5経由でシリアル化されたオブジェクトを返すときに循環参照エラーを解決する方法を尋ねるポストhereがあります。 WCF Webフォームプロジェクトでこの同じ問題が発生しました。Jsonシリアル化循環参照エラーをどのように解決しましたか?

私はWCF/webフォームプロジェクトとMVC3プロジェクトでこの問題を「解決」できました。私は、これがEFシリアライゼーションの「もの」であると思われるので、どのタイプのプロジェクトが重要ではないと思います。

私はこのように私のObjectContextコンストラクタでProxyCreationを無効にすることで、問題を解決:

public class MyObjectContext : DbContext, IDbContext 
{ 
    public MyObjectContext(string connectionStringName) : base(connectionStringName) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = false; 
    } 
    public DbSet<Product> Products {get;set;} 
    //etc. 
} 

を私の質問は:これは一見問題を解決するだろう、なぜ誰かが説明してもらえますか?

私の問題はPOCOのナビゲーションプロパティと関係していると思いますが、それ以降は私は困惑しています。ありがとう。

+3

+1あなたのタイトルが私を笑顔にしたからです! :-) –

+0

あなたはこの場所で話していることを知っているふりをすることはできません。正直なところ最高です。 +1に感謝します。 – trevorc

答えて

9

プロキシ作成をオフにすると、遅延読み込みもオフになります。エンティティのシリアル化が発生すると、すべてのナビゲーションプロパティを参照します。レイジーローディングが有効になっている場合、関連するすべてのオブジェクトがロードされ、それらを直列化しようとします。再度、親オブジェクトを指すナビゲーションプロパティを含むすべてのプロパティを参照します。この時点で、このプロパティが循環参照であることをシリアル化する必要があります。または、オブジェクトを再度シリアル化して、無限ループで続行します。

ここでは、ScriptIgnore属性を持つ子エンティティの循環ナビゲーションプロパティに注釈を付けることができます。

+0

それは完璧な意味合いがあります。私はそれが遅延読み込みを伴わなければならないと思ったが、私はプロキシの作成が遅い読み込みを無効にしたことに気付かなかった。素晴らしい答え!ありがとう。 – trevorc

+2

ScriptIgnoreが機能しません。プロキシの作成を厳しく無効にすると機能します。 – hazimdikenli

-1

クイックノートは:あなたはまだ例外に直面した場合

.Include("NestedObject")

親子関係が消えてしまいます。この方法だけでなく、例外を取り払うことを覚えて

1

循環参照はあなたのために起こりますオブジェクトに熱心な読み込みを使用します。

あなたがメソッドのカップルを持っている:偽のあなたは、あなたのクエリ(LINQやラムダ)をロードするとき

    は熱心なロードをオフにし
  • DbContext.Configuration.ProxyCreationEnabled =;オブジェクト
  • デタッチオブジェクトをロード中に
  • はそれらを含めるドメインモデル
  • から仮想キーワードを削除(=なしイーガーローディング機能&プロキシなし)
    • Repository.Detach(entityObject)
    • DbContext。エントリ(entityObject).EntityState = EntityState.Detached
  • クローン特性
    • AutoMapperのようなものを使用してオブジェクトを複製することも、ICloneableインターフェイスを使用しないこともできます。これはオブジェクトのProxyPropertiesも複製するため動作しません。
  • あなたは異なる構成でseparteプロジェクトを使用してみてください、APIを構築している場合(つまり、プロキシを返さない)

PS。プロキシは、EFがEntity Frameworkから読み込んだときに作成されるオブジェクトです。つまり、元の値と更新された値が保持されているため、後で更新することができます。それは他のものを扱います;-)

関連する問題