在ef-core的流畅API中建立父子关系和处理删除的正确方法

时间:2019-05-01 22:40:53

标签: c# .net-core entity-framework-core parent-child ef-fluent-api

我想对父子,自引用关系模型执行级联删除。

已将模型(模型A)配置为具有父子关系,自指关系,这种关系相当于树形结构。模型A可以由模型B引用,模型B创建一对多关系。当我删除模型A的实例时,我想删除模型B,以及所有在模型A下的子级联删除。我想配置模型或fluent-api来实现这种行为,但是遇到一个异常,

  

“未处理的异常:System.Data.SqlClient.SqlException:在表'SecuredEntity'上引入FOREIGN KEY约束'FK_SecuredEntity_SecuredEntity_ParentUid'可能会导致循环或多个级联路径。请指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN关键约束。”

当我尝试将脚本应用于数据库时。我该如何解决并获得所需的行为?下面是该代码的基本概述。

    [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);

0 个答案:

没有答案