.NET 7.0使用DbContext插入数据报错:Invalid column name 'RoleId'
问题分析与解决方案
问题根源
- 字段类型不匹配:数据库表中
siteuserid是nvarchar(75)类型,但实体类中siteUserID定义为int,EF生成SQL时会按实体类型映射,导致字段名称/类型不匹配报错。 - 数据库表定义错误:表的主键声明为
(role_ID, username),但表中无username字段,实际应为(role_id, siteuserid);同时role_id被设为自增IDENTITY列,却作为外键关联Role表,插入时无法手动指定值,与业务逻辑冲突。 - EF映射冗余:实体类已通过DataAnnotation声明复合主键,OnModelCreating中重复配置引发映射冲突。
解决步骤
1. 修正数据库表定义
移除role_id的IDENTITY属性(作为外键需手动指定值),修正主键为实际存在的字段:
CREATE TABLE ARTF.Role_Assignment ( role_id int NOT NULL, siteuserid nVarchar(75) NOT NULL, PRIMARY KEY (role_id, siteuserid), FOREIGN KEY (siteuserid) REFERENCES ARTF.SiteUser(siteuserid), FOREIGN KEY (role_id) REFERENCES ARTF.Role (role_id) );
2. 修正实体类映射与字段类型
将siteUserID类型改为string匹配表结构,移除冗余引用:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace ARTFY.com.Data { [Table("Role_Assignment", Schema="ARTF")] public class Role_Assignment { [Key, Column("role_id", Order = 0)] public int RoleId { get; set; } [Key, Column("siteuserid", Order = 1)] public string siteUserID { get; set; } } }
3. 修正DbContext代码
移除重复的主键配置,替换原生SQL查询为EF查询(避免SQL注入并匹配映射):
public partial class ARTFDbContext : IdentityDbContext<SiteUser>, IARTFDbContext { //=== Tables or entities === public DbSet<dbSiteUser> SiteUser { get; set; } public DbSet<Role> Role { get; set; } public DbSet<Email_Confirmation_Code> Email_Confirmation_Code { get; set; } public DbSet<Password_reset_code> Password_reset_code { get; set; } public DbSet<Role_Assignment> Role_Assignment { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 移除重复的主键配置,实体类已通过DataAnnotation定义 } public bool AddRoleAssigment(Role_Assignment userRoleAssignment) { try { // 使用EF查询替代原生SQL,避免注入并匹配映射 var exists = Role_Assignment.Any(ra => ra.RoleId == userRoleAssignment.RoleId && ra.siteUserID == userRoleAssignment.siteUserID); if (exists) { return false; } Add(userRoleAssignment); int numberOfChangesMade = SaveChanges(); return numberOfChangesMade > 0; } catch (Exception ex) { ts.save($"{ex.Message} {ex.StackTrace}", "ARTFDbContext - AddRoleAssignment"); return false; } } }
4. 验证Identity配置一致性
确保SiteUser实体继承自IdentityUser<string>(主键类型为string,与Role_Assignment中的siteUserID类型匹配),保证Identity与DbContext的映射逻辑一致。
内容的提问来源于stack exchange,提问作者NCR
相关产品推荐
相关产品推荐

