ID 列上的 Dapper returns SQL 转换错误

Dapper returns SQL conversion error on ID column

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

Conversion failed when converting the nvarchar value 'abcdefg' to data type int.'

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

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

谢谢

我在 运行 应用程序上的 sql 分析器发布问题后立即找到了答案。解决方案非常愚蠢。

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

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

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

但是,有时这不起作用。如果不存在 Key 属性,请尝试将该字段放在 class 的顶部,DapperExtensions 可能会将其视为您的主键。

或者尝试使用 ExplicitKey?