Подтвердить что ты не робот

Циркулярная ссылка на платформу сущностей

Повторяя этот вопрос, потому что моя первая попытка была едва согласована: p

Итак, я смущен и использую Entity Framework Code First

У меня есть класс Forest.

У меня есть класс Tree.

В каждом лесу может быть много деревьев

Когда я пытался сериализоваться, я получал круговую ссылку

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 a Guid вместо Guid?, я получаю ошибки Circular Reference.

Я также пробовал protected override void

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

Заранее спасибо

4b9b3361

Ответ 1

Лучший подход - вы должны использовать 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;}
 }

Edit:

Наряду с ScriptIgnore вы также должны удалить virtual из Forest и Trees, и это сработает. Я протестировал его. Тем не менее, я бы не советовал, потому что виртуальное ключевое слово - это то, что делает Lazy. Следовательно, как я уже сказал, вам нужно создать DTO на основе этих моделей и отправлять только DTO клиенту.