Dapper无法解析属性:Transactions表插入方法执行失败求助
解决Dapper插入[dbo].[Transactions]表时无法识别列的问题
检查SQL语句的列名拼写与转义
Transactions是SQL保留关键字,表名必须用方括号转义,同时要保证插入语句里的列名和数据库表完全一致(注意大小写,若数据库用区分大小写的排序规则更要严谨)。正确的插入语句示例:INSERT INTO [dbo].[Transactions] ([Id], [AccountId]) VALUES (@Id, @AccountId)别漏了列名的方括号,Dapper不会自动转义关键字类的列名或表名。
验证实体属性与参数的映射
核对C#Transactions类的属性名、数据类型是否和数据库列完全匹配,要是属性加了[Column]特性,必须和数据库列名一致:public class Transactions { public Guid Id { get; set; } // 对应数据库的Id类型,比如int/Guid public int AccountId { get; set; } }用匿名对象传参时,键名要和SQL里的参数名完全对应:
var param = new { Id = Guid.NewGuid(), AccountId = 123 };确认数据库表的实际结构
直接在数据库工具(比如SSMS)里执行以下SQL,核对列名、数据类型是否和你预期的一致,排查拼写错误(比如AccountID和AccountId的大小写差异):SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Transactions' AND TABLE_SCHEMA = 'dbo'开启Dapper日志排查参数映射
临时开启Dapper日志,查看实际生成的SQL和参数传递情况,定位是否是参数没正确映射:Dapper.SqlMapper.Log = message => Console.WriteLine(message);执行插入后看日志输出,确认SQL语句和参数列表是否符合预期。
排查是否存在同名表混淆
确认当前连接的数据库中,dbo架构下只有一个Transactions表,避免其他架构下的同名表导致Dapper定位错误。硬编码参数测试排除映射问题
先写一段完全硬编码的插入语句测试,排除参数映射的干扰:await connection.ExecuteAsync("INSERT INTO [dbo].[Transactions] ([Id], [AccountId]) VALUES ('12345678-1234-5678-1234-567812345678', 123)");如果这段代码能成功,说明问题出在参数映射上;如果还是失败,要检查当前数据库用户是否对
Transactions表有INSERT权限(虽然其他操作正常,但权限问题不能完全排除)。
内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo
相关产品推荐
相关产品推荐

