我已经把头发拉出来大约 2 天了,因为每当我向现有实体添加多对多实体时,我根本无法让 EF 保存更改。
我的结构很简单:
我有一个名为 的表
Person
,它有一个 ID(主要、身份)和一些其他字符串字段Keyword
使用 ID(Primary,identity)和字符串字段调用的表Value
and a
PersonKeywordRelation
, with aPersonId
, and aKeywordId
字段
当我生成了我的实体(首先是数据库)时,我得到了一个Person
带有ICollection<Keyword>
- 一切都很好的类,可以按预期工作。
Person
当我尝试使用修改后的关键字列表保存现有的 时,就会出现问题。只保存标量属性(字符串),而不是我的关键字!
- 我试过禁用延迟加载,没有效果。
- 我尝试再次从数据库中加载每个单独的关键字,但没有效果。
- 我尝试将所有关键字加载到上下文中以查看这是否有助于 EF 检测更改,但没有。
我很确定我不是唯一一个遇到这个问题的人,(事实上我完全确定,因为我已经在这里看到了几个关于同一主题的问题,但我无法找到一个有效的答案。 ..),主要用于旧版本的 EF,这是我为什么开始另一个问题的另一个很好的理由:没有任何改变可以解决这个问题吗?
这是我的代码,用于更新(和创建)人员。您会注意到我尝试相应地进行 EF 保存更改。
public void SavePersons(IList<Person> persons)
{
// Create a EF Context
using (var ctx = new MyDbEntities())
{
foreach (var person in persons)
{
// Attach
ctx.Persons.Attach(person);
// Insert or update?
ctx.Entry(person).State = person.Id == 0 ? EntityState.Added : EntityState.Modified;
// Get current keywords before clearing from entity
var keywords = new List<Keyword>(person.Keywords);
// Clear keywords from entity, so we can add fresh ones, hopefully
// EF will have an easier time handling this..
person.Keywords.Clear();
// Add keywords
keywords.ForEach(kw =>
{
ctx.Keywords.Attach(kw);
ctx.Entry(kw).State = EntityState.Modified;
person.Keywords.Add(kw);
});
}
// Save
ctx.SaveChanges();
}
}