2012-10-10 14 views
12

:PEntity Frameworkの循環参照

だから私は、私は森のクラスを持っているスーパー混乱し、Entity Frameworkのコードファーストに

を使用しています。

私はTreeクラスを持っています。私は

public class Forest 
{ 

    public Guid ID { get; set; } 
    public virtual List<Tree> Trees { get; set; } 
} 
public class Tree 
{ 
    public Guid ID { get; set; } 
    public Guid? ForestId {get;set;} 

    [ForeignKey("ForestId")] 
    public virtual Forest Forest {get;set;} 
} 

すべての森は木を持っているではなく、すべての木が森の中にある循環参照を取得したシリアル化しようとしていたとき

各フォレストには、多くの木

を持つことができます。モデルが森に

ある

@(Html.Raw(Json.Encode(Model))) 

を行うとき、私は多重度のいずれかのエラーと格闘し、私が代わりにGuid?ForestIdGuidを作る場合、私は循環参照エラーが発生します。

私も 保護されたオーバーライドボイドを試してみました事前に

OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Forest>() 
    .HasMany(x => x.Tree) 
    .WithOptional() 
    .HasForeignKey(y => y.ForestId); 
} 

おかげ

+0

DataContractSerializerを使用していますか?もしそうなら、あなたのDataContractsは表示されませんが、IsReference = trueを設定する必要があります。 –

答えて

16

ベストなアプローチは、あなたがクライアントに必要なデータのみを転送するためのDTOを使用する必要があるだろう。 DTOは単純なプロパティを持つ必要があるため、循環参照エラーは作成されません。現時点では森はList<Trees> Treesがあり、樹木内の各TreeForestを持っており、そのForestは再びあなたが JSONをしたくない性質のためScriptIgnoreを使用して属性を飾ることができますList<Trees>

それとも

を持っています。エンコードしてシリアル化すると、クライアントには返されません。

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute.aspx

例:

public class Forest 
{  
    public Guid ID { get; set; } 
    public virtual List<Tree> Trees { get; set; } 
} 
public class Tree 
{ 
    public Guid ID { get; set; } 
    public Guid? ForestId {get;set;} 

    [ForeignKey("ForestId")] 
    [ScriptIgnore] 
    public virtual Forest Forest {get;set;} 
} 

編集:あなたもForestTreesからvirtualを削除する必要があり、それが働くだろうScriptIgnoreとともに

。私はそれをテストしました。しかし、私は、仮想キーワードはLazyローディングと同じものなので、私はそれをアドバイスしません。したがって、私が言ったように、これらのモデルに基づいてDTOを作成し、クライアントにDTOだけを送信する必要があります。

+0

スクリプトを無視しても、それは私に循環参照を与えたので、モデルを見ました。ツリーのIDフィールドは、フォレストのIDフィールドのようにドリルダウンし続けます。 NewId()を使用してデータベースで生成されたGUIDを使用していますが、これが原因の可能性がありますか?私はForestでもTrees = nullを設定していて、それでも循環参照を与えています。 – Jordan

+0

@Jordan:私の編集を参照してください。 – TCM

+0

ありがとうございました。私は昨夜私が仮想をオフにすることができたことに気づいた。私はそれが理想的な解決策ではないことを認識していますが、私はこのプロジェクトのプロトタイプを作成していますので、この例では問題ありません。将来の制作作業では、私は本当にDTOを使用します! ありがとうございます! – Jordan