12

再次尝试这个问题,因为我的第一次尝试几乎没有连贯性:p

所以我非常困惑并首先使用实体​​框架代码

我有森林课。

我有一个树类。

每个森林可以有很多树

当我尝试序列化时,我得到了循环引用

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

模型是森林的地方

如果我做ForestIdaGuid而不是 aGuid?我得到循环参考错误。

我也试过受保护的覆盖无效

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>

或者

您可以使用您不希望 Json.Encode 序列化的属性来装饰您的属性ScriptIgnore,然后不会将其发送回客户端。

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

编辑:

ScriptIgnore您一起还应该virtualForestand中删除Trees,这将起作用。我已经测试过了。但是,我不建议这样做,因为虚拟关键字是延迟加载的原因。因此,正如我所说,您需要基于这些模型创建 DTO,并且只将 DTO 发送给客户端。

于 2012-10-10T04:39:20.510 回答