我有一组具有多对多关系的表(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:违反UNIQUE KEY约束 'IX_KeyWord'。无法在对象'dbo.KeyWord'中插入重复键。该 重复键值是(ADJUDICATION)。声明一直如此 终止。
如果我删除设置word属性的代码(Word = SelectedKeyWord.Word )当我创建关键字对象时,我收到此错误。
System.Data.Entity.Validation.DbEntityValidationException:验证 一个或多个实体失败。有关详细信息,请参阅“EntityValidationErrors”属性。
这告诉我字段是必需的。
答案 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);
}