Отношение к себе 1:1 в EF

У меня есть объект типа ScheduleItem

 public class ScheduleItem : EntityBase
    {
        [MaxLength(500)]
        [Required]
        public string TitleAr { get; set; }

        [MaxLength(300)]
        [Required]
        public string TitleEn { get; set; }
        public int? ParentScheduleItemId { get; set; }


        public int? PreviousDestinationId { get; set; }
        public int? NextDestinationId { get; set; }

        public ScheduleItem ParentScheduleItem { get; set; }

        [InverseProperty("ParentScheduleItem")]
        public ICollection<ScheduleItem> ChildrenScheduleItems { set; get; }

        public ScheduleItem PreviousDestination { get; set; }
        public ScheduleItem NextDestination { get; set; }

}

Этот объект является родительским объектом, внутри него есть набор дочерних элементов.

Каждый дочерний элемент имеет необязательную ссылку на следующий дочерний элемент (последний дочерний элемент будет иметь NextDestinationId = null) и необязательную ссылку на предыдущий дочерний элемент (PreviousDestinationId для первого дочернего элемента должен иметь значение null).

введите здесь описание изображения

Код построителя модели:

   modelBuilder.Entity<ScheduleItem>().HasOptional(t => t.NextDestination).WithMany().HasForeignKey(t => t.NextDestinationId);
        modelBuilder.Entity<ScheduleItem>().HasOptional(t => t.PreviousDestination).WithMany().HasForeignKey(t => t.PreviousDestinationId);

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

Каково решение этой проблемы? мне нужно звонить SaveChanges() дважды?


person Ra'ed Alaraj    schedule 18.04.2017    source источник
comment
Возможный дубликат Как сопоставить рекурсивное отношение к себе в подходе Entity Framework с приоритетом кода @OP: проверьте этот ответ. Имхо, это идеальное решение   -  person Matthias Burger    schedule 18.04.2017


Ответы (1)


Решение состоит в том, чтобы переосмыслить отношения и структуру. У меня нет комментариев по поводу отношения родитель/потомок, поскольку вы не объясняете, почему необходим родитель того же типа (рекурсивное отношение).

Родственные отношения не нужны, удалите их все вместе и замените столбцом SortOrder числового типа. Затем родитель должен вернуть отсортированный список/коллекцию на основе этого типа. Элементы расписания не должны знать о следующих/предыдущих элементах расписания, которые находятся рядом с ними, пусть об этом беспокоится родитель.

Так что замените

public int? PreviousDestinationId { get; set; }
public int? NextDestinationId { get; set; }
public ScheduleItem PreviousDestination { get; set; }
public ScheduleItem NextDestination { get; set; }

с

// sort from low-to-high in the context of a collection
public int SortOrder { get; set; }
person Igor    schedule 18.04.2017