实体框架循环引用



再次尝试这个问题,因为我的第一次尝试几乎没有连贯: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)))

其中模型是森林

如果我ForestId Guid而不是Guid?,我会收到循环引用错误。

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

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

提前致谢

最好的方法是使用 DTO 仅将所需的数据传输到客户端。DTO 应该只有简单的属性,这样它就不会产生循环引用错误。此刻,森林已经List<Trees> Trees,树中的每个Tree都有Forest,而Forest又有List<Trees>

您可以使用不需要的属性的ScriptIgnore来修饰属性Json.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;}
 }

编辑:

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

相关内容

  • 没有找到相关文章

最新更新