Entity Framework Circular Reference

 ̄綄美尐妖づ 提交于 2019-11-30 22:58:44

问题


Trying this question again because my first attempt was barely coherent :p

So I am super confused and using Entity Framework Code First

I have a Forest class.

I have a Tree class.

Each Forest can have many Trees

When I was trying to serialize I was getting circular reference

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

Every forest has trees but not every tree is in a forest. I struggle with either errors of Multiplicity when doing

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

Where the model is a Forest

and if I make ForestId a Guid instead of a Guid? I get Circular Reference errors.

I also tried protected override void

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

Thanks in advance


回答1:


Best approach would be you should use DTOs to transfer only the data that you want to the client. The DTOs should have just simple properties so it won't create a circular reference error. At the moment the Forest has List<Trees> Trees and each Tree within Trees has Forest and that Forest again has List<Trees>

Or

You can decorate your attributes with ScriptIgnore for properties that you don't want the Json.Encode to serialize and then that wouldn't be sent back to the client.

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

Eg:

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

Edit:

Along with ScriptIgnore you should also remove virtual from Forest and Trees and that would work. I've tested it. However, I wouldn't advise that because virtual keyword is what does the Lazy loading. Hence as I said you need to create DTOs based on these Models and only send in DTO to client.



来源:https://stackoverflow.com/questions/12811975/entity-framework-circular-reference

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!