You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不修改数据库结构时用EF修改复合键列id_rol?

问题描述

我有如下3张表:
三张表结构

我尝试通过EF更新Users_Roles表的id_rol列,代码如下:

var ur = db1.CRM_Users_Roles_N01
    .Where(x => x.id_user == cRM_Users_Roles_N01.id_user).SingleOrDefault();
ur.id_rol = cRM_Users_Roles_N01.id_rol;
db1.Entry(cRM_Users_N01).State = EntityState.Modified

但VS抛出异常:

Property 'id_rol' is part of the information object key, it can't modify.

请问如何在不修改实际数据库结构的前提下,用EF修改Users_Roles表的id_rol列?


解决方案

方法1:删除旧关联后插入新记录

由于EF默认不允许修改主键字段(id_rol是复合主键的一部分),可以通过删除原关联记录+插入新关联记录的方式实现需求:

// 查询用户当前的角色关联
var oldRoleLink = db1.CRM_Users_Roles_N01
    .SingleOrDefault(x => x.id_user == cRM_Users_Roles_N01.id_user);

// 删除旧关联
if (oldRoleLink != null)
{
    db1.CRM_Users_Roles_N01.Remove(oldRoleLink);
}

// 创建并添加新的角色关联
var newRoleLink = new CRM_Users_Roles_N01
{
    id_user = cRM_Users_Roles_N01.id_user,
    id_rol = cRM_Users_Roles_N01.id_rol
};
db1.CRM_Users_Roles_N01.Add(newRoleLink);

// 提交所有更改
db1.SaveChanges();

方法2:执行原生SQL语句

直接绕开EF的实体跟踪机制,用原生SQL语句更新数据,这是最直接的方式:

// 参数化SQL避免注入风险
var updateSql = @"UPDATE CRM_Users_Roles_N01 
                  SET id_rol = @NewRoleId 
                  WHERE id_user = @UserId";

// 执行SQL
db1.Database.ExecuteSqlRaw(updateSql,
    new SqlParameter("@NewRoleId", cRM_Users_Roles_N01.id_rol),
    new SqlParameter("@UserId", cRM_Users_Roles_N01.id_user));

注意:使用原生SQL时必须用参数化查询,禁止直接拼接字符串,防止SQL注入漏洞。


内容的提问来源于stack exchange,提问作者Vikant Az

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:37:36