首页 > 解决方案 > 与自身有关系的表上的流利 API

问题描述

我创建了一个与自身有关系的表,该表具有一对多的关系,这是我的实体:

    public class Permission
    {
        [Key]
        public int PermissionId { get; set; }      
        public string PermissionTitle { get; set; }
        public int? ParentId { get; set; }

        #region Relations

        [ForeignKey("ParentId")]
        public virtual ICollection<Permission> Permissions { get; set; }   

        #endregion

    }

但是当我使用迁移在 SQL 中创建表时,update-database由于此错误而失败:

Introducing FOREIGN KEY constraint 'FK_Permission_Permission_ParentId' on table 'Permission' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

所以我决定使用 fluent API 来解决这个问题,但我不知道如何ON DELETE NO ACTION通过 Fluent API 在与自身有关系的表上进行指定。有什么帮助吗?有什么办法可以解决我的问题吗?

标签: entity-frameworkasp.net-core-mvcef-fluent-apief-core-2.1

解决方案


对于 EF Core,实体通常应该有两个导航属性,如下所示:

public class Permission
{
    [Key]
    public int PermissionId { get; set; }
    public string PermissionTitle { get; set; }
    public int? ParentPermissionId { get; set; }

    #region Relationships
    public virtual Permission ParentPermission { get; set; }

    public virtual ICollection<Permission> ChildPermissions { get; } = new HashSet<Permission>();
    #endregion

}

并像这样配置:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Permission>()
            .HasMany(p => p.ChildPermissions)
            .WithOne(p => p.ParentPermission)
            .HasForeignKey(p => p.ParentPermissionId)
            .OnDelete(DeleteBehavior.Restrict);

        base.OnModelCreating(modelBuilder);
    }

推荐阅读