有更短的方法来进行此更新吗?
void Update(Table1 table1Entry, Table2[] table2entries)
{
entities.Table1.Attach(table1Entry);
var table2EntriesIds = table2entries.Select(a => a.Id);
var updates = entities.Table2
.Where(a => table2EntriesIds.Contains(a.Id));
foreach(var update in updates)
{
entities.Table2.Attach(update);
}
var deletions = entities.Table2
.Where(a => a.Table1Id == table1Entry.Id);
.Where(a => !table2EntriesIds.Contains(a.Id));
foreach(var deletion in deletions)
{
entities.DeleteObject(deletion);
}
var insertions = table2entries.Except(matches);
foreach(var insertion in insertions)
{
entities.AddToTable2(insertion);
}
entities.SaveChanges();
}
其中Table2有一个Table1_Id外键。
答案 0 :(得分:1)
这个想法是正确的。您可以对其进行优化,例如,您不会单独加载要更新的关系和要删除的关系,但您仍然必须手动将实体的当前分离状态与数据库中的状态同步。同步实体图状态的唯一方法是按实体和关系手动执行。
问题是你的代码是否有效。我认为不是。它不会更新任何记录,因为它不会更改要修改的记录的状态。您也无法再次附加从上下文加载的记录。作为最后一点,如果那些table1和table2以某种方式相关,我没有看到任何代码使用关系本身(除非你使用FK属性)。