再次尝试这个问题,因为我的第一次尝试几乎没有连贯: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
,您还应该从Forest
和Trees
中删除virtual
,这将起作用。我已经测试过了。但是,我不建议这样做,因为虚拟关键字是延迟加载的内容。因此,正如我所说,您需要基于这些模型创建DTO,并且仅将DTO发送给客户端。