实体框架核心:多对多级联

时间:2020-12-20 19:24:08

标签: asp.net-core .net-core entity-framework-core

我不知道该以哪种方式执行此操作,因此请求一些指导。我的实体设置为 https://stackoverflow.com/a/53972658/980917

我有一个 RoleEntity、PermissionEntity 和一个 RolePermissionsEntity。通常设置...

RoleEntity - has ICollection<PermissionEntity> 

RolePermissionEntity - joining entity

PermissionEntity - has ICollection<RoleEntity> 

在 OnModelBuilding 中我有...

        modelBuilder.Entity<RolePermissionEntity>()
            .HasKey(a => new { a.RoleId, a.PermissionId });

        modelBuilder.Entity<RolePermissionEntity>()
            .HasOne(rp => rp.Role)
            .WithMany(b => b.UserPermissions)
            .HasForeignKey(bc => bc.Role);

        modelBuilder.Entity<RolePermissionEntity>()
            .HasOne(rp => rp.Permission)
            .WithMany(c => c.RolePermissions)
            .HasForeignKey(bc => bc.PermissionId);

现在我知道我需要添加 OnDelete 关键字,但我不知道要使用哪些关键字来实现我的目标。

我希望:-

  • 如果角色被删除,删除连接表并保留权限。
  • 如果连接表条目被删除,请保留角色和权限。

任何帮助/解释都会很棒。

1 个答案:

答案 0 :(得分:0)

您可以使用 .OnDelete(DeleteBehavior.Cascade)

modelBuilder.Entity<RolePermissionEntity>(O =>
        {
            O.HasKey(a => new { a.RoleId, a.PermissionId });
            O.HasOne(rp => rp.Role)
             .WithMany(b => b.RolePermissionEnties)
             .HasForeignKey(bc => bc.RoleId).OnDelete(DeleteBehavior.Cascade);
            O.HasOne(rp => rp.Permission)
                .WithMany(c => c.RolePermissionEnties)
                .HasForeignKey(bc => bc.PermissionId);
        });

删除角色: //将Role和join表中的相关数据删除。

var role = _context.RoleEntity.Single(c => c.Id == 2);
 _context.Remove(role);
 _context.SaveChanges();

删除连接表(假设1和1有关系): //只会删除连接表。

var rolepermission= _context.RolePermissionEntity.Where(o => o.RoleEntityId == 1&&o.PermissionEntityId==1).FirstOrDefault();
_context.Remove(rolepermission);
_context.SaveChanges();