Самостоятельная ссылка EF определяет циклы - PullRequest
0 голосов
/ 22 октября 2018

У меня есть таблица со ссылками на себя, и я использую структуру сущностей для ее определения.

public class Table
{
    public int Id { get; set; }

    public Table Parent { get; set; }

    [ForeignKey(nameof(Parent))]
    public int? ParentId { get; set; }

    public virtual ICollection<Table> Children { get; set; } = new List<Table>();
}

Используя только EF, я могу определить, когда добавляю новое отношение, что есть цикл.Например, с данными:

  • Элемент 1
    • Элемент 2
      • Элемент 3
    • Элемент 4
    • Item 5

Когда я пытаюсь добавить Item 1 в Item 3, я должен определить, что цикл будет создан.

1 Ответ

0 голосов
/ 22 октября 2018

Под "только EF" я предполагаю, что вы имеете в виду: под одним запросом Linq

Тогда AFAIK, это не возможно.

Вы должны прочитать: Рекурсивный запрос LINQ: выберитеitem и все дочерние элементы с дочерними элементами

Рассмотрим следующий код «не только EF»:

public AddChildren(Table t) {
    var parent = this;
    while ( parent != null ) {
        if ( parent.Id == t.Id )
            throw new Exception("cycle");
        parent = parent.Parent;
    }
    Children.Add(t);
}

ПРЕДУПРЕЖДЕНИЕ: возможен бесконечный цикл в случае существующего цикла.

Возможно, вам также следует:

  • проверить наличие дублированного дочернего элемента
  • рассмотреть возможность использования представления дерева интервалов: https://sqlpro.developpez.com/cours/arborescence/ (извините, я не могу найти английскую бумагу).При таком представлении существует решение "EF only".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...