与自己相关的表上的流利API

时间:2018-10-11 13:04:24

标签: entity-framework asp.net-core-mvc ef-fluent-api ef-core-2.1

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

    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解决此问题,但是我不知道如何通过Fluent API在与自身有关系的表上指定ON DELETE NO ACTION。有什么帮助吗? 有什么解决方案可以解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

对于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);
    }