12

私の最初の試みはほとんど首尾一貫していなかったので、この質問をもう一度試してみてください:p

だから私は非常に混乱しており、Entity Framework Code Firstを使用しています

フォレストクラスがあります。

私はツリークラスを持っています。

各森は多くの木を持つことができます

シリアル化しようとしたときに、循環参照を取得していました

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)))

モデルが森の場合

ForestIda のGuid代わりに aを作成するGuid?と、循環参照エラーが発生します。

私も保護されたオーバーライドボイドを試しました

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

前もって感謝します

4

1 に答える 1

17

最善の方法は、DTO を使用して、必要なデータのみをクライアントに転送することです。DTO には単純なプロパティのみが含まれている必要があるため、循環参照エラーが発生しません。現時点では、森が持っていて、木List<Trees> Trees のそれぞれが持っていて、それもまた持っていますTreeForestForestList<Trees>

または

ScriptIgnoreJson.Encode をシリアライズしたくないプロパティの属性をデコレートして、クライアントに送り返さないようにすることができます。

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;}
 }

編集:

あなたと一緒にandからScriptIgnoreも削除する必要があり、それはうまくいくでしょう。私はそれをテストしました。ただし、仮想キーワードは遅延読み込みを行うものであるため、お勧めしません。したがって、私が言ったように、これらのモデルに基づいて DTO を作成し、DTO をクライアントに送信するだけです。virtualForestTrees

于 2012-10-10T04:39:20.510 に答える