使用 EF 获得 update/insert 值的更好方法

Better way to update/insert values using EF

我正在努力解决一个问题,同时也在学习和提高我的代码技能。

我正在使用 Entity Framework,我的任务是写入 SQL table,我可以根据某行是否存在来更新或插入。如果不存在则添加它,如果存在则根据需要更新它。

我有 2 个列表,第一个列表是我正在写入的 table 中的 EF 类型。第二个列表是 class,它由 SQL 查询组成,但共享 table 中需要更新的一些列,因此如果它们不同,则更新 table 具有不同的 属性 值。

foreach (var tbl in Table_List)
{
    foreach (var query in SQL_Query)
    {
        if (tbl.ID == query.ID)
        {
            bool changed = false;
            if (tbl.Prop1 != query.Prop1)
            {
                tbl.Prop1 = query.Prop1;
                changed = true;
            }
            if (tbl.Prop2 != query.Prop2)
            {
                tbl.Prop2 = query.Prop2;
                changed = true;
            }

            if (changed)
                await Context.SaveChangesAsync();
        }
    }
}

class中总共有10个属性,但即使所有10个属性都不同我只需要更新2个属性,其余的可以保持不变。总而言之,我的问题是; 有没有更好的方法来更新这两个属性?除了大量的 if 语句和 foreach 循环之外还有什么?任何关于直接插入的信息也将不胜感激,非常感谢!

EF 使用内部 ChangeTracker。这意味着当您更改正在跟踪的实体的 属性 时(您使用上下文中的 DbSet 查询列表),它将在 ChangeTracker 中标记为“已更改”。 SaveChangesAsync 使用它来确定要做什么,即。更新的插入以及需要更新的字段。 其次,此 ChangeTracker 足够智能,可以检测到当您将 属性 设置为它已有的相同值时,它不会被标记为更改。 此外,使用此 ChangeTracker,无需在每次更改后调用 SaveChangesAsync。您可以在循环结束时调用它。

foreach (var tbl in Table_List)
{
    foreach (var query in SQL_Query)
    {
        if (tbl.ID == query.ID)
        {
            tbl.Prop1 = query.Prop1;
            tbl.Prop2 = query.Prop2;
        }
    }
}
await Context.SaveChangesAsync();