Я бы хотел выполнить каскадное удаление в модели отношений с родителями и детьми, ссылающейся на себя.
настроили модель (Модель A), чтобы иметь отношение родителя-ребенка, самоссылочную связь к тому, что равнозначно древовидной структуре. На модель A может ссылаться модель B, которая создает отношение один ко многим. Когда я удаляю экземпляр модели A, я хотел бы удалить модель B, а также все дочерние элементы в модели A при каскадном удалении. Я хотел бы настроить модели или API-интерфейс fluent, чтобы дать мне такое поведение, но я столкнулся с исключением, которое говорит,
«Необработанное исключение: System.Data.SqlClient.SqlException: введение ограничения FOREIGN KEY« FK_SecuredEntity_SecuredEntity_SecuredEntity_ParentUid »в таблице« SecuredEntity »может вызывать циклы или несколько каскадных путей. Укажите« УДАЛИТЬ »,« НЕ УКАЗАТЬ »или« УДАЛИТЬ »,« ИЛИ УМЕНЬШИТЬ »или« ОБНОВИТЬ НЕТ »,« АКЦИЯ »или« ОБНОВИТЬ НЕТ » КЛЮЧЕВЫЕ ограничения. "
когда я пытаюсь применить скрипт к базе данных. Как я могу решить эту проблему и получить поведение, которое я хочу? Базовый обзор кода приведен ниже.
[Table(nameof(ModelA))]
public class ModelA : BaseModel // Has Id and Uid
{
public Guid? ParentUid { get; set; }
public ModelA Parent { get; set; }
public ICollection<ModelA> Children { get; set; }
public ICollection<ModelB> OtherModels { get; set; }
}
[Table(nameof(ModelB))]
public class ModelB : BaseModel
{
[Required]
public ModelB ModelBInstance { get; set; }
public Guid ModelBUid { get; set; }
}
// From OnModelCreating method
modelBuilder.Entity<ModelB>()
.HasOne(mb => mb.ModelBInstance)
.WithMany(ma => ma.OtherModels)
.HasForeignKey(mb => mb.ModelBUid)
.HasPrincipalKey(ma => ma.UId);
modelBuilder.Entity<ModelA>()
.HasOne(ma => ma.Parent)
.WithMany(ma => ma.Children)
.HasForeignKey(ma => ma.ParentUid)
.HasPrincipalKey(ma => ma.UId)
.OnDelete(DeleteBehavior.Cascade);