C# 此EntitySet中已存在具有相同标识的实体。-WCF RIA服务

C# 此EntitySet中已存在具有相同标识的实体。-WCF RIA服务,c#,silverlight,wcf-ria-services,C#,Silverlight,Wcf Ria Services,我有以下代码,我希望这些代码能够检查实体是否存在,如果不存在,则将其添加到集合中。然后,我在上下文中调用submitchanges来保存更改 int kwID = (int)(from d in this._keywordSource.Source where d.keyword.ToLower() == searchText.ToLower() select d.keywordID).FirstOrDefault(); if ( null == this._context.Rules.Wher

我有以下代码,我希望这些代码能够检查实体是否存在,如果不存在,则将其添加到集合中。然后,我在上下文中调用submitchanges来保存更改

int kwID = (int)(from d in this._keywordSource.Source where d.keyword.ToLower() == searchText.ToLower() select d.keywordID).FirstOrDefault();
if ( null == this._context.Rules.Where(e => e.keywordID == kwID && e.searchTerm == item.SearchTerm).FirstOrDefault())
    {
        this._context.Rules.Add(new Rule() { keywordID = kwID, searchTerm = item.SearchTerm, processed = false });
    }
我用3个关键字/searchTerm组合来测试这一点:

苹果

iPad/iPad

iPod/iPod

第一次尝试从未运行.Add代码行。第二个成功。第三个抛出错误
此EntitySet中已存在具有相同标识的实体。

我已经读到,这与标识和种子有关,特别是如果您的种子在db中为0。我的不是(设置为1)。EntitySet本身包含约1900个项目

我错过了什么

[编辑] 添加了kwID代码以显示关键字最终是条件中的kwID

此表的primaryKey是ruleID。这是我认为在错误消息中被违反的。。。。但我不知道如何或为什么

IMHO,错误的条件。 例子: 你的数据库中有:

  • KWid:5,搜索词:iPod
  • KWid:6,SearchTerm:iPad
在你的情况下,你把价值观

  • KWid:5,SearchTearm:GooglePhone
this.\u context.Rules.Where(e=>e.keywordID==5&&e.searchTerm==“GooglePhone”).FirstOrDefault()返回null,因此您尝试添加一个具有现有KWid的行

解决方案:将条件更改为(&C)||

if ( null == this._context.Rules.Where(e => e.keywordID == kwID || e.searchTerm == item.SearchTerm).FirstOrDefault())

我可能应该在我的代码块中输入关键字解析为kwID。现在更新以反映。很抱歉一个特定的kwIDOk可以有多个搜索词。你注意到iPad/iPad实体的RuleId了吗?奇怪的是,它们已经在我的数据库中了,所以我不知道为什么会这样。我对EF比较陌生。。。