Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper返回ID列上的SQL转换错误_C#_Sql_Asp.net Mvc_Dapper Extensions - Fatal编程技术网

C# Dapper返回ID列上的SQL转换错误

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可能希望动

在我的数据库中,我有一个nvarchar类型的ID列,因为它包含唯一的用户名。在.NETMVC应用程序中,我使用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在何处接管