我正在使用dapper扩展(SqlMapperExtensions.cs)。
进行简单插入时:
db.Insert<Student>(student);
我得到一个例外:
Object of type 'System.Int32' cannot be converted to type 'System.Int16'.
数据库中的Id类型是SmallInt POCO中的Id类型为Short。
当我在Catch块中断点时,我可以看到数据已成功保存到 数据库。似乎问题是当方法返回并尝试将创建的新Id设置到POCO中时。
当我将POCO中的Id类型更改为Int 时,它可以正常工作。
这是一个错误吗?我错过了什么?
答案 0 :(得分:1)
这看起来像一个bug 的期望。这是实际的插入语句SqlMapperExtensions正在使用(在第530行附近):
var r = connection.Query("select @@IDENTITY id", transaction: transaction, commandTimeout: commandTimeout);
int id = (int)r.First().id; // (1)
if (keyProperties.Any())
keyProperties.First().SetValue(entityToInsert, id, null); // (2)
return id;
您可以看到该标识应该是一个int(参见上面的(1))。然后尝试使用int值在实体上设置属性(参见上面的注释(2))。当你的POCO的身份属性很短时,上面会抛出异常。
修改强>
如评论中所述,Dapper.Contrib现在支持[Key]
属性。
答案 1 :(得分:0)
最新的Dapper Contrib代码现在支持插入的short / Int16标识属性。 nuget包尚未更新(截至6月7日 - 15日),但很快就会更新。