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

使用Dapper Extension向SQL Server插入数据时类型转换异常问题

问题根源

Dapper Extensions的Insert方法默认会将SQL Server生成的主键以System.Int64(long)类型返回,即便你的数据库主键是INT(对应.NET的System.Int32/int)。当框架尝试把这个Int64值自动赋值给模型类的Int32类型Id属性时,就会触发ArgumentException类型转换错误——虽然数据已经成功写入数据库,但后续的赋值操作失败抛出异常。

解决方案

方法1:手动转换返回值(快速修复)

调用Insert后,显式将返回的Int64值转换为Int32,再赋值给模型的Id属性:

// 原错误代码
// employee.Id = connection.Insert(employee);

// 修改后代码
var insertedId = connection.Insert(employee);
employee.Id = Convert.ToInt32(insertedId);

注意:SQL Server的INT类型最大值为2^31-1,只要你的主键不会超出这个范围,该转换是安全的。

方法2:配置Dapper Extensions自定义主键类型映射(全局/实体级)

如果不想每次插入都手动转换,可以自定义主键生成器或实体映射,让框架返回Int32类型的主键:

全局配置自定义主键生成器

  1. 创建自定义主键生成类:
public class Int32IdentityGenerator : IdentityGenerator<int>
{
    public override int Generate(ISqlGenerator sqlGenerator, IDbConnection connection)
    {
        var identityQuery = sqlGenerator.GetIdentitySql(connection);
        return connection.QuerySingle<int>(identityQuery);
    }
}
  1. 在应用启动时注册该生成器:
// 注册实体映射程序集(替换为你的实体所在程序集)
DapperExtensions.DapperExtensions.SetMappingAssemblies(new[] { typeof(EmployeeDetails).Assembly });
// 设置默认主键生成器为自定义的Int32版本
DapperExtensions.DapperExtensions.DefaultMapper = typeof(Int32IdentityGenerator);

实体级自定义映射

针对EmployeeDetails实体单独配置主键类型:

public class EmployeeDetailsMapper : ClassMapper<EmployeeDetails>
{
    public EmployeeDetailsMapper()
    {
        Table("EmployeeDetails");
        // 指定主键为自增类型,并使用Int32转换器
        Map(x => x.Id).Key(KeyType.Identity).TypeConverter(typeof(Int32Converter));
        // 映射其他属性(示例)
        Map(x => x.EmployeeName).Column("EmployeeName");
        Map(x => x.Department).Column("Department");
    }
}

方法3:改用Dapper原生ExecuteScalar(绕过Dapper Extensions的自动映射)

如果不需要Dapper Extensions的ORM特性,直接用Dapper原生方法执行插入并返回指定类型的主键:

var insertSql = @"
INSERT INTO EmployeeDetails (EmployeeName, Department) 
VALUES (@EmployeeName, @Department);
SELECT CAST(SCOPE_IDENTITY() AS INT);";

employee.Id = connection.ExecuteScalar<int>(insertSql, employee);

这种方式完全控制返回值类型,避免框架自动转换带来的问题。

验证

修改代码后重新运行插入操作,确认:

  1. 数据成功写入EmployeeDetails表
  2. 页面不再抛出System.ArgumentException类型转换错误
  3. 调试时查看employee.Id的类型为System.Int32

内容的提问来源于stack exchange,提问作者Kudiyarasu M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:15:25