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

.NET 7.0使用DbContext插入数据报错:Invalid column name 'RoleId'

问题分析与解决方案

问题根源

  1. 字段类型不匹配:数据库表中siteuserid是nvarchar(75)类型,但实体类中siteUserID定义为int,EF生成SQL时会按实体类型映射,导致字段名称/类型不匹配报错。
  2. 数据库表定义错误:表的主键声明为(role_ID, username),但表中无username字段,实际应为(role_id, siteuserid);同时role_id被设为自增IDENTITY列,却作为外键关联Role表,插入时无法手动指定值,与业务逻辑冲突。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:51:08