0

换句话说,代码语言。并假设发票是从上下文中挑选的。

无阻无变

void updateInvoice(DataBaseEntities context, Invoice invoice, float amount, string currency)
{
  invoice.amount = amount;
  invoice.currency = currency;
  context.SaveChanges();
}

防止无变化

void updateInvoice(DataBaseEntities context, Invoice invoice, float amount, string currency)
{
  var needToUpdate = false;

  if ( invoice.amount != amount )
  {
    invoice.amount = amount;
    needToUpdate = true;
  }

  if (invoice.currency != currency)
  {
    invoice.currency = currency;
    needToUpdate = true;
  }

  if (needToUpdate) context.SaveChanges();
}

现实更多的是复杂的数据库和几十万条记录。

我应该更喜欢什么来优化流程?

4

2 回答 2

1

在 Entity Framework 中,上下文对象在内存中保存它正在跟踪的对象的状态记录。如果调用int numberOfItemsSaved = context.SaveChanges(),它将返回调用 SaveChanges 时处于已添加、已修改或已删除状态的对象的数量。 SaveChanges()还会重置所有对象的更改跟踪信息,因此SaveChanges()对同一函数的多次调用可能会0在第二次调用时显示返回值。

换句话说,Entity Framework 知道的对象不会被传递,SaveChanges()除非对象上的 Property 发生实际更改。

于 2013-08-13T22:17:52.727 回答
1

我什么都不会优化。EF 会自动跟踪更改,您只需要关闭它们

实体框架通过保留原始数据的副本来自动执行此操作,以检测发生了什么变化。但是,由于您要询问优化,您可能应该阅读Performance Considerations,特别是标题为“5 NoTracking Queries”的部分。

可以关闭更改跟踪,并且您必须执行您在原始问题中提出的要求(假设在这种情况下您甚至想要做这样的事情)。

在某些情况下,这可能很有用,例如插入大量数据,因为更改跟踪相对较慢,并且在这种情况下通过关闭更改跟踪获得的性能提升非常显着,大约将几分钟变为几十秒。但是,这种情况不需要任何形式的更改跟踪,因此您仍然不必实现自己的。

于 2013-08-13T22:29:07.350 回答