参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的
Posted
技术标签:
【中文标题】参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的【英文标题】:A parameter named 'p__linq__0' already exists in the parameter collection. Parameter names must be unique in the parameter collection 【发布时间】:2011-06-09 15:45:22 【问题描述】:这是我从 Entity Framework 得到的一个奇怪的错误:“参数集合中已经存在一个名为 'p_linq_0' 的参数。参数名称在参数集合中必须是唯一的。”我没有做任何自定义参数或任何花哨的东西,只是直接的 LINQ 查询或存储过程执行,没有花哨的东西,没有什么特别的,没有 Entity SQL... 那为什么会发生这个错误呢?
谢谢。
【问题讨论】:
Entity Framework 生成的查询首先为每个名为@p_linq_0
、@p_linq_1
等的输入参数声明变量。@
有时似乎被省略了,但我不确定是什么原因这。我猜 Entity Framework 认为它正在做一些特定于其事务范围的事情,但不知何故,它的变量在多个事务中保持范围。
您使用的是什么数据库?例如,SQL Server、SQL Sever Compact、SQLite、mysql 等
你能发布你的代码吗?
它是在对象上下文的 SaveChanges() 调用中抛出的,我什至没有引用 @p_linq_0...
我之前也遇到过同样的错误,是我手动更改实体模型添加字段时发生的,该字段已添加到数据库中。如果您尝试删除表格,然后从服务器资源管理器中将其拖回,它应该可以工作。 (请务必先备份您的文件)
【参考方案1】:
我遇到了同样的问题 - 我在自己的 Task.Run
s 中并行运行多个查询。
我的每个查询都使用了我填充的 Id 列表
var ids = _someList.Select(x => x.Thing.Id).Distinct()
构造多个查询的参数,我在其中几个做string.Join(",", ids)
。
答案最终变得显而易见:延迟执行。
每个查询,在它正在执行string.Join(",", ids)
时,最终(同时)执行了对导致重复参数 (p_linq_0) 的 id 的查询。
只需添加.ToList()
以在该行上执行就意味着查询具有要使用的具体 ID 列表,并且并非所有人都尝试自己同时执行。
var ids = _someList.Select(x => x.Thing.Id).Distinct().ToList();
【讨论】:
【参考方案2】:如果没有看到您的代码,我们可能无法弄清楚您的问题是什么。听起来有几件事可能会导致这种情况。不过,我似乎发现了一个。我有一个主键是枚举的模型,所以我这样做了:
context.Tests.Where(t => t.TypeId == TestTypeId.SingleTimeWholeClass)
莫名其妙地,将比较的每一边都转换为一个 int 解决了我的问题:
context.Tests.Where(t => (int)t.TypeId == (int)TestTypeId.SingleTimeWholeClass)
可能与您的问题完全无关。发布代码总是有帮助的。
【讨论】:
以上是关于参数集合中已存在名为“p__linq__0”的参数。参数名称在参数集合中必须是唯一的的主要内容,如果未能解决你的问题,请参考以下文章
我想创建一个名为 VALIDATE_EMP 的函数,它接受 employeeNumber 作为参数,根据存在返回 TRUE 或 FALSE