如何在不修改数据库结构时用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
相关产品推荐
相关产品推荐

