3

在我的数据库中,我有一个 nvarchar 类型的 ID 列,因为它包含唯一的用户名。在我的 .Net MVC 应用程序中,我使用 Dapper 来处理数据库交换。然后DapperExtensions.Get(dynamic id)我在我的模型上使用 ID 字段获取特定条目。这在所有情况下都很好用,除了出现以下错误的用户:

将 nvarchar 值“abcdefg”转换为数据类型 int 时转换失败。

我知道这是 ID 列,因为当它用于使用 Dapper 提取实体时,该值存在于我的 User 模型的 ID 属性中。我最好的猜测是,也许 Dapper 期望该dynamic id参数是一个 int 并试图这样使用它。我希望比我自己更了解的人对此进行澄清。

我已确保我的数据库表为此字段使用 nvarchar 并将其标记为主键。

谢谢

4

2 回答 2

3

确保使用 Dapper.Contrib.Extensions.Key 属性将正确的属性标记为 Key 属性。不要使用 System.ComponentModel.DataAnnotations.Key,因为它可能会有所不同。

但是,有时,众所周知这是行不通的。如果没有 Key 属性,请尝试将该字段放在类的顶部,DapperExtensions 可能会将其视为您的主键。

或者尝试使用 ExplicitKey?

于 2018-01-24T17:02:41.883 回答
2

在发布问题后,我通过在应用程序上运行 sql profiler 找到了答案。解决方案是一个非常愚蠢的解决方案。

使用分析器,我可以看到 Dapper 创建的 sql 命令正在尝试将 nvarchar 与另一个确实是整数列的列进行匹配。然后我查看了我的 User 模型并注意到该列显示为该模型中声明的第一个属性。

解决方案是将 ID 属性移动为第一个声明的属性,然后一切正常。显然 Dapper 只是使用模型中第一个声明的属性作为 ID 列,尽管哪个属性[Key]上可能有属性标签。

于 2018-01-24T16:58:15.927 回答