Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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# 衣冠楚楚;仅支持具有单个[Key]或[ExplicitKey]的实体”;_C#_Dapper_Dapper Contrib - Fatal编程技术网

C# 衣冠楚楚;仅支持具有单个[Key]或[ExplicitKey]的实体”;

C# 衣冠楚楚;仅支持具有单个[Key]或[ExplicitKey]的实体”;,c#,dapper,dapper-contrib,C#,Dapper,Dapper Contrib,我在MVC5 c#环境中使用了Dapper和Dapper.Contrib,有时部署生产站点时会出现以下错误: GetAll仅支持具有单个[Key]或[ExplicitKey]的实体 财产在 Dapper.Contrib.Extensions.SqlMapperExtensions.GetSingleKey[T](字符串 方法)在 Dapper.Contrib.Extensions.SqlMapperExtensions.GetAllAsync[T](IDbConnection 连接,IDbTra

我在MVC5 c#环境中使用了
Dapper
Dapper.Contrib
,有时部署生产站点时会出现以下错误:

GetAll
仅支持具有单个[Key]或[ExplicitKey]的实体 财产在 Dapper.Contrib.Extensions.SqlMapperExtensions.GetSingleKey[T](字符串 方法)在 Dapper.Contrib.Extensions.SqlMapperExtensions.GetAllAsync[T](IDbConnection 连接,IDbTransaction事务,可为null的`1命令超时)

不过,这种情况大约每三分之一就发生一次

我怀疑
Dapper.Contrib
会自动注意到我的主键,因为它名为“Id”,但我用
[ExplicitKey]
(它是一个GUID)修饰了它,也许这些属性会冲突。也许是完全不同的

除了可能重命名我的主键之外,你知道如何解决这个问题吗

有关模型的一部分:

[Table("Tasks")]
public class TasksModel
{
    [ExplicitKey]
    public Guid Id { get; set; }

...

我认为这与房产的名称“id”有关。以下是中的KeyCache构建代码,其中没有具有[Key]属性的属性

var idProp = allProperties.Find(p => string.Equals(p.Name, "id", StringComparison.CurrentCultureIgnoreCase));

在您的情况下,您将获得一个ExplicitKey(通过在模型中使用[ExplicitKey]装饰您的密钥)和一个密钥(默认情况下,此属性称为Id)。除非您可以更改DB列名,否则我将使用常规Dapper。

我遇到了完全相同的问题,唯一的区别是我们将[ExplicitKey]SqlHierarchyId作为主键。您是否找到了解决方法,或者找到了原因?(我正在考虑使用vanilla Dapper中的QueryAsync,而不是GetAsync,它可以工作,但不能解决Contrib的问题…)谢谢@DarthVeyda担心我既找不到原因也找不到好的解决方案(因为我的问题是间歇性的)。我不再遇到这个问题了,我想我只是将有问题的模型的GetAll()切换到了常规的dapper。对于其他类似的类,我仍然使用contrib,没有任何问题。今天我第一次在我们的生产web api系统上看到这个问题。唯一的解决办法是重新启动服务器。如果这种情况再次发生,我将从代码中删除dapper.contrib。我已经查看了dapper.contrib的源代码,出现此问题的唯一方法是,如果它构建的内部缓存认为有问题的类型上有2个[Key]或2个[ExplicitKey]或1个。我敢肯定,就像这次行动一样,情况并非如此。所以内部缓存机制似乎有一个bug。谢谢你的输入-你的猜测和我在原始帖子中的猜测是一样的。但除了重命名主键(也在原始帖子中提到)之外,我还没有看到问题的证据或解决方案。我已经看过Contribs的源代码,但找不到问题所在。如果找不到名为“id”的字段,则作为注释比作为答案更合适i.m.o.Dapper.Contrib查找[Key]。签入函数
private static List KeyPropertiesCache(类型类型)
var keyperties=allProperties.Where(p=>p.GetCustomAttributes(true).Any(a=>a是keypattribute)).ToList();如果(keyProperties.Count==0){var idProp=allProperties.Find(p=>string.Equals(p.Name,“id”,StringComparison.CurrentCultureIgnoreCase));
那么,您在KeyPropertiesCache中获得相同的属性,因为它被称为id,而在ExplicitKeyPropertiesCache中获得相同的属性,因为它被
[ExplicitKey]修饰
。没有属性冲突,但相同的属性最终同时作为键(DB生成)和ExplicitKey(不由DB生成)还有Dapper.Contrib被你想要的东西弄糊涂了。几个月前我遵循代码时,attribute ExplicitKey没有遵循相同的路径。但这是很久以前的事了,我可能记错了。我会再看一看,如果你是对的,相应地奖励你:)谢谢