Правильный способ настройки отношений между родителем и ребенком и обработки удалений в свободном API ef-core - PullRequest
0 голосов
/ 02 мая 2019

Я бы хотел выполнить каскадное удаление в модели отношений с родителями и детьми, ссылающейся на себя.

настроили модель (Модель 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...