0

我有一组具有多对多关系的表(ConditionTemplate 和 KeyWord)。在代码中,我试图将关键字添加到特定的 ConditionTemplate 记录。不幸的是,当我认为我正在向特定条件添加关键字时,我收到一个错误,就好像它正在添加一个新关键字而不与条件相关联。

我的模型的图像: 在此处输入图像描述

我的代码:

全局变量创建:

    EnterpriseEntities EE;
    ConditionTemplate myConditionTemplate;

加载全局变量:

            EE = new EnterpriseEntities();
            EE.Database.Connection.ConnectionString = Myapp.EnterpriseEntityConnectionString;

            myConditionTemplate = EE.ConditionTemplates.Where(c => c.TemplateCode == "17D").FirstOrDefault();

上面的代码加载了一个带有许多关键字的条件。

可用关键字位于列表框中,用户按下按钮选择关键字以移至条件。这是处理它的代码。

                foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
                {



                    KeyWord NewKeyWord = new KeyWord
                    {
                        KeyWordID = SelectedKeyWord.KeyWordID,
                        ID = SelectedKeyWord.ID,
                        Word = SelectedKeyWord.Word

                    };

                    myConditionTemplate.KeyWords.Add(NewKeyWord);



                }

然后用户按下一个按钮来保存更改,我打电话

 EE.SaveChanges

然后我得到这个错误:

System.Data.UpdateException:更新条目时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:违反唯一键约束“IX_KeyWord”。无法在对象“dbo.KeyWord”中插入重复键。重复键值为 (ADJUDICATION)。该语句已终止。

如果我在创建关键字对象时删除设置 word 属性 (Word = SelectedKeyWord.Word ) 的代码,则会收到此错误。

System.Data.Entity.Validation.DbEntityValidationException:一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。

这告诉我单词字段是必需的。

4

1 回答 1

1

为了告诉 EFKeyWord您选择的 s 已经存在于数据库中并避免出现问题,您必须将它们附加到上下文中:

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
{
    KeyWord NewKeyWord = new KeyWord
    {
        // You actually only need to set the primary key property here
        ID = SelectedKeyWord.ID
    };

    EE.KeyWords.Attach(NewKeyWord);
    myConditionTemplate.KeyWords.Add(NewKeyWord);
}

编辑

如果KeyWord实体已经附加到您的上下文(例如,因为它们之前已经使用相同的上下文加载过),您可以使用:

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
{
    KeyWord NewKeyWord = EE.KeyWords.Find(SelectedKeyWord.ID);
    myConditionTemplate.KeyWords.Add(NewKeyWord);
}
于 2013-07-29T22:08:18.853 回答