使用Entity Framework 4.0时如何更新不同表的相关条目?

时间:2012-02-14 18:26:25

标签: c# .net entity-framework entity-framework-4

有更短的方法来进行此更新吗?

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外键。

1 个答案:

答案 0 :(得分:1)

这个想法是正确的。您可以对其进行优化,例如,您不会单独加载要更新的关系和要删除的关系,但您仍然必须手动将实体的当前分离状态与数据库中的状态同步。同步实体图状态的唯一方法是按实体和关系手动执行。

问题是你的代码是否有效。我认为不是。它不会更新任何记录,因为它不会更改要修改的记录的状态。您也无法再次附加从上下文加载的记录。作为最后一点,如果那些table1和table2以某种方式相关,我没有看到任何代码使用关系本身(除非你使用FK属性)。