使用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类型的主键:
全局配置自定义主键生成器
- 创建自定义主键生成类:
public class Int32IdentityGenerator : IdentityGenerator<int> { public override int Generate(ISqlGenerator sqlGenerator, IDbConnection connection) { var identityQuery = sqlGenerator.GetIdentitySql(connection); return connection.QuerySingle<int>(identityQuery); } }
- 在应用启动时注册该生成器:
// 注册实体映射程序集(替换为你的实体所在程序集) 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);
这种方式完全控制返回值类型,避免框架自动转换带来的问题。
验证
修改代码后重新运行插入操作,确认:
- 数据成功写入
EmployeeDetails表 - 页面不再抛出
System.ArgumentException类型转换错误 - 调试时查看
employee.Id的类型为System.Int32
内容的提问来源于stack exchange,提问作者Kudiyarasu M
相关产品推荐
相关产品推荐

