Самостоятельная ссылка в моделях Entity Framework Core при использовании InverseProperty - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть следующие модели:

  public class MasterData
  {
    [Key]
    public Guid ID { get; set; }

    [Required]
    public string Name { get; set; } 

    [InverseProperty(nameof(DetailData.MasterData))]
    public List<Detaildata> Details { get; set; }
  }

  public class DetailData
  {
    [Key]
    public Guid ID { get; set; }

    [Required]
    public string Name { get; set; }

    [InverseProperty(nameof(ChildData.DetailData))]
    public List<ChildData> Children { get; set; }

    public Guid MasterDataID { get; set; }

    [ForeignKey(nameof(MasterDataID))]
    public MasterData MasterData { get; set; }
  }


  public class ChildData
  {
    [Key]
    public Guid ID { get; set; }

    [Required]
    public string Name { get; set; }

    public Guid SectionID { get; set; }

    [ForeignKey(nameof(SectionID))]
    public Section ChildSection { get; set; }

    public Guid DetailDataID { get; set; }

    [ForeignKey(nameof(DetailDataID))]
    public DetailData DetailData { get; set; }
  }

Чтобы убедиться, что миграция сгенерирована правильно, и , чтобы избежать теневых свойств , я добавляю атрибут InverseProperty, чтобы определить оба конца отношения.

Однако, когда я пытаюсь сериализовать экземпляры, я получаю следующее исключение:

Обнаружен самоссылочный цикл для свойства DetailData с типом 'Models.DetailData. Путь 'Value.Item1.Details [0] .Children [0]'.

Что ж, очевидно, что это самоссылающийся цикл, поскольку MasterData имеет DetailData, у которого есть MasterData объект навигации назад - как и должно быть в навигационных отношениях.

К сожалению, мне нужно сериализовать эти объекты.

Обходным решением было бы пометить свойства InverseProperty атрибутом JsonIgnore, но я не уверен, что это вызовет в десериализующей стороне проекта.

Что я должен сделать, чтобы избежать цикла самоссылки, не игнорируя свойства навигации?

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете игнорировать циклическую ссылку в глобальном масштабе, отредактировав WebApiConfig.cs и введя следующий код:

config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore

Если вы используете .NET Core, отредактируйте Startup.cs, добавив

var mvc = services.AddMvc(options =>
        {
           ...
        })
        .AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

Для решения этой проблемы еще можно использовать аннотации, указав [JsonIgnore] в свойстве Details.

...