0

我正在使用小巧的扩展(SqlMapperExtensions.cs)。

进行简单插入时:

db.Insert<Student>(student);

我得到一个例外:

Object of type 'System.Int32' cannot be converted to type 'System.Int16'.

db 中的 Id 类型是 SmallInt。
POCO 中的 Id 类型是 Short。

当我在 Catch 块中设置断点时,我可以看到数据已成功保存到数据库。似乎问题在于方法返回并尝试将创建的新 Id 设置到 POCO 中。

当我将 POCO 中的 Id 类型更改为 Int时,它可以工作。

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

4

2 回答 2

1

这看起来像一个期望的错误这是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]属性。

于 2014-10-25T14:05:30.353 回答
0

最新的 Dapper Contrib 代码现在支持插入的 short/Int16 标识属性。nuget 包尚未更新(截至 6 月 7 日 -15 日),但很快就会更新。

于 2015-06-07T19:00:51.623 回答