Dapper Extensions - 类型对象' System.Int32'无法转换为类型' System.Int16'

时间:2014-10-25 10:35:38

标签: dapper dapper-extensions

我正在使用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 时,它可以正常工作。

这是一个错误吗?我错过了什么?

2 个答案:

答案 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日),但很快就会更新。