保存到具有多对多关系的实体

时间:2013-07-29 20:33:04

标签: c#-4.0 entity-framework-4.1

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

我模特的形象: enter image description here

我的代码:

全球变量创作:

    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:违反UNIQUE KEY约束   'IX_KeyWord'。无法在对象'dbo.KeyWord'中插入重复键。该   重复键值是(ADJUDICATION)。声明一直如此   终止。

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

  

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

这告诉我字段是必需的。

1 个答案:

答案 0 :(得分:1)

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

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);
}