使用 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();
我正在努力解决一个问题,同时也在学习和提高我的代码技能。
我正在使用 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();