Таблица соединения EF Core ManyToMany с той же связью модели, проблема с поведением каскадного удаленияC#

Место общения программистов C#
Ответить
Anonymous
 Таблица соединения EF Core ManyToMany с той же связью модели, проблема с поведением каскадного удаления

Сообщение Anonymous »

Объединенная таблица с двумя одинаковыми объектами сохраняет связь этих объектов. Проблема заключается в ограничении внешнего ключа, препятствующем каскадному удалению, что требуется для логики моего приложения.
У меня есть объект «Сотрудник» и таблица соединений ManagedBy, которую я хочу представить. управленческие отношения между сотрудниками. ManagedBy состоит из ManagerId и Subordinate (оба — сотрудники), а его ключ представляет собой комбинацию этих двух. Проблема заключается в поведении OnDelete, когда я хочу удалить любую связанную запись ManagedBy при удалении сотрудника независимо от того, был ли он менеджером или подчиненным.
При создании шаблонов я не могу использовать следующее поведение каскадного удаления. :

Код: Выделить всё

modelBuilder.Entity(entity =>
{
entity.HasKey(x => new {x.ManagerId, x.SubordinateId});

modelBuilder.Entity()
.HasOne(em => em.Manager)
.WithMany(e => e.MBManagers)
.HasForeignKey(em => em.ManagerId);
.OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity()
.HasOne(em => em.Subordinate)
.WithMany(e => e.MBSubordinates)
.HasForeignKey(em => em.SubordinateId)
.OnDelete(DeleteBehavior.Cascade);
});
Я получаю эту ошибку при вызове Update-Database:

Введение ограничения FOREIGN KEY «FK_ManagedBys_AspNetUsers_SubordinateId» в таблице «ManagedBys» ' может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.

При использовании предлагаемого поведения удаления No Action на подчиненном я могу удалить Менеджер и связанные записи ManageBy также удаляются, но не Подчиненный:

Код: Выделить всё

modelBuilder.Entity(entity =>
{
entity.HasKey(x => new {x.ManagerId, x.SubordinateId});

modelBuilder.Entity()
.HasOne(em => em.Manager)
.WithMany(e => e.MBManagers)
.HasForeignKey(em => em.ManagerId);
.OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity()
.HasOne(em => em.Subordinate)
.WithMany(e => e.MBSubordinates)
.HasForeignKey(em => em.SubordinateId)
.OnDelete(DeleteBehavior.NoAction);
});
Насколько я понимаю, это сделано для предотвращения множественных каскадных путей в тех случаях, когда у двух сотрудников есть записи ManagedBy, в которых они одновременно являются менеджерами и подчиненными друг друга, или я ошибаюсь? Я уверен, что что-то упускаю.
Как обеспечить удаление всех записей ManageBy при удалении связанного сотрудника независимо от того, является ли он руководителем или подчиненным?

Подробнее здесь: https://stackoverflow.com/questions/785 ... lete-behav
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»