EFCore OnDelete Каскад много к одному - PullRequest
1 голос
/ 03 февраля 2020

У меня есть модель данных, которая выглядит следующим образом:

public class Entity1
{
    public Guid Id { get; set; }
}

public class Entity2
{
    public Guid Id { get; set; }

    public Entity1 RelatedEntity { get; set; }
}

В моем случае может быть много Entity2s для каждого Entity1, но, насколько я могу судить, это не так в моем режиме данных действительно имеет смысл Entity1 отслеживать все Entity2s, которые его используют. Возможно, я неправильно понимаю, как модели данных должны быть построены.

Кажется (из учебников Microsoft), что для установки .OnDelete(DeleteBehavior.Cascade); вам необходимо иметь двустороннюю связь между сущностями. Кто-нибудь знает, возможно ли сделать это так, что если Entity1 будет удален, он также возьмет с собой все экземпляры Entity2? Должен ли я изменить свою модель данных так, чтобы Entity1 сохранял список Entity2's?

Спасибо!

1 Ответ

1 голос
/ 03 февраля 2020

Ни одно из свойств навигации не требуется.

Все, что вам нужно для настройки отношения, - это правильная пара Has{One|Many} + With{One|Many}. Под правильным я имею в виду следующее - если соответствующий конец отношения имеет навигацию, он должен быть передан в качестве аргумента, в противном случае не следует передавать лямбда-выражение / имя свойства).

т.е. в вашем случае вы можете использовать либо

modelBuilder.Entity<Entity2>()
    .HasOne(e2 => e2.RelatedEntity)
    .WithMany() // no navigation property

или

modelBuilder.Entity<Entity1>()
    .WithMany<Entity2>() // no navigation property
    .HasOne(e2 => e2.RelatedEntity)

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

Как только вы это сделаете, у вас будет доступ к API отношений для настройки FK, каскадного удаления и т. д. c. Например,

.OnDelete(DeleteBehavior.Cascade)

Вы также можете сделать Требуется FK (который по умолчанию включает каскадное удаление):

.IsRequired()

Для получения дополнительной информации см. Раздел Отношения документации EF Core, в частности Ручная настройка и Одно свойство навигации .

...