删除将 PK 用作 FK 约束的数据库表行

本文关键字:数据库 约束 FK PK 用作 删除 | 更新日期: 2023-09-27 17:56:29

我有一个方法,可以通过userId从我的用户表中删除用户:

public void DeleteUser(int id)
{
    User delObj = (Users.Where(u => u.UserId == id)).Single();
    Users.Remove(delObj);
    SaveChanges();
}

主键 userId 也用作 userroles 表中的外键,其中有 UserRoleId (PK)、UserId (FK) 和 RoleId (FK)。我不确定如何使用一种方法删除两个表中的两行。

以下是确切的属性:

public class User
{
    [Key]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
}

public class UserRole
{
    [Key]
    public int UserRoleId { get; set; }
    public int UserId { get; set; }
    public short RoleId { get; set; }
    public virtual Role Role { get; set; }
}

我将其添加到我的 DbContext 中,但它仍然无法正常工作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
        .HasMany(u => u.UserRoles)
        .WithOptional().WillCascadeOnDelete(true);
    base.OnModelCreating(modelBuilder);
}

仍然发生外部约束错误。

删除将 PK 用作 FK 约束的数据库表行

您需要改为配置用户角色实体:

modelBuilder.Entity<UserRole>().HasForeignKey(r => r.UserId).WillCascadeOnDelete(true);

我在删除用户对象之前添加它来解决这个问题:

UserRole deleteUserRoleObject = (UserRoles.Where(ur => ur.UserId == id)).Single();
        UserRoles.Remove(deleteUserRoleObject);
        SaveChanges();