C# Dapper返回ID列上的SQL转换错误
在我的数据库中,我有一个nvarchar类型的ID列,因为它包含唯一的用户名。在.NETMVC应用程序中,我使用Dapper处理数据库交换。然后在我的模型上使用C# Dapper返回ID列上的SQL转换错误,c#,sql,asp.net-mvc,dapper-extensions,C#,Sql,Asp.net Mvc,Dapper Extensions,在我的数据库中,我有一个nvarchar类型的ID列,因为它包含唯一的用户名。在.NETMVC应用程序中,我使用Dapper处理数据库交换。然后在我的模型上使用DapperExtensions.Get(动态id)来获取id字段的特定条目。这在所有情况下都非常有效,但在我遇到以下错误的用户中除外: 将nvarchar值“abcdefg”转换为数据类型int时,转换失败。' 我知道这是ID列,因为当使用Dapper提取实体时,该值存在于我的用户模型的ID属性中。我最好的猜测是,Dapper可能希望动
DapperExtensions.Get(动态id)
来获取id字段的特定条目。这在所有情况下都非常有效,但在我遇到以下错误的用户中除外:
将nvarchar值“abcdefg”转换为数据类型int时,转换失败。'
我知道这是ID列,因为当使用Dapper提取实体时,该值存在于我的用户模型的ID属性中。我最好的猜测是,Dapper可能希望动态id
参数是int,并尝试使用它。我希望得到比我更了解这一点的人的澄清
我已确保我的数据库表对此字段使用nvarchar,并将其标记为主键
谢谢在发布问题后,我通过在应用程序上运行sql分析器找到了答案。这个解决方案相当愚蠢 使用探查器,我可以看到Dapper创建的sql命令试图将nvarchar与另一个列(实际上是整数列)进行匹配。然后,我查看了我的用户模型,并注意到此列显示为此模型中声明的第一个属性
解决方案是将ID属性移动为第一个声明的属性,然后一切正常。显然,Dapper只使用模型中第一个声明的属性作为ID列,不管哪个属性上可能有
[Key]
属性标记。确保使用Dapper.Contrib.Extensions.Key属性将正确的属性标记为Key属性。不要使用System.ComponentModel.DataAnnotations.Key,因为它的作用可能不同
然而,有时,这是已知的不起作用。当不存在键属性时,请尝试将该字段置于类的顶部,DapperExtensions可能会将其视为主键
或者尝试使用ExplicitKey?在SQL Server中无法使用Identity属性设置varchar字段(我假设您使用的是SQL Server)。仅限整数/十进制类型。看来你的假设是正确的。我对整洁不太熟悉,但你能给我一根线吗?您似乎将
主键
与标识
混淆了。您是否可以在C#中为您的用户模型提供代码,并在SQL Server中为用户表提供模式?仅供参考,您引用的是Dapper和DapperExtensions,就好像它们是一个一样;事实并非如此。DapperExtensions确实利用了Dapper,但它不是Dapper项目的一部分,它有自己的逻辑和配置选项。确保您了解Dapper的范围从何处开始和结束,以及DapperExtensions在何处接管