【问题标题】:Delete table row using PK and row in other table where it's a foreign key使用 PK 删除表行和其他表中它是外键的行
【发布时间】:2015-06-16 15:27:08
【问题描述】:

我有一个方法可以通过 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; }
    }

【问题讨论】:

  • 对 FK 定义使用级联删除?
  • 告诉我你用的是什么ORM,我会告诉你确切的解决方案。
  • 刚刚编辑,够不够请告诉我

标签: c# mysql asp.net-mvc


【解决方案1】:

在 c# 中实现实体之间的关系。例如,在用户对象上创建角色实体的集合。 ORM(我猜你正在使用 EntityFramework 或 NHibernate)将负责自动删除依赖对象。

class User {
     public virtual ICollection<UserRole> UserRoles { get; set; }
}

它应该映射为多对多关系。

您必须在 DBContext 上添加:

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

【讨论】:

  • 我更新以显示我目前拥有的内容。但是,当我删除用户时似乎没有建立连接。
  • 是EntityFramework吗?如果角色集合正在填充,请检查您何时在“用户”上获取?
  • 仍然出现错误:DELETE 语句与 REFERENCE 约束“FK_UserRoles_Users”冲突。冲突发生在数据库“C:\CODE\REWORK\REWORK\APP_DATA\AUTHORIZATIONDB.MDF”、表“dbo.UserRoles”、列“UserId”中。声明已终止。
  • 好的,刚刚更新了我的答案,请在您的 DBContext 上添加提到的 OnModelCreating 方法,该方法将通知 EF 在删除用户对象时级联相关集合项
  • 我现在有点困惑。我添加了 OnModelCreating 方法,但尝试 SaveChanges() 后仍然出现相同的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2020-05-13
相关资源
最近更新 更多