首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于实体框架,防止SaveChanges从不更改的客户端进行优化是否有用?

对于实体框架,防止SaveChanges从不更改的客户端进行优化是否有用?
EN

Stack Overflow用户
提问于 2013-08-13 21:47:17
回答 2查看 316关注 0票数 0

在代码语言中使用其他术语。假设发票是从上下文中挑选的。

而不阻止任何更改,

代码语言:javascript
运行
复制
void updateInvoice(DataBaseEntities context, Invoice invoice, float amount, string currency)
{
  invoice.amount = amount;
  invoice.currency = currency;
  context.SaveChanges();
}

具有防止任何更改的

代码语言:javascript
运行
复制
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();
}

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

我应该选择什么来优化过程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-13 22:29:07

我什么都不会优化。EF自动跟踪变化,您将永远只想关闭他们。

Entity通过保留原始数据的副本来自动完成此操作,以便检测更改与否。但是,由于您询问的是优化,您可能应该阅读业绩考虑,特别是题为"5 NoTracking查询“的部分。

关闭更改跟踪是可能的,而且您必须按照原来问题中的要求进行操作(假设在这种情况下,您甚至会想要做这样的事情)。

在某些情况下,这可能是有用的,比如插入大量数据,因为更改跟踪相对较慢,在这种情况下,关闭更改跟踪可以获得非常显著的性能增益,只需将多分钟转换为数十秒。然而,这种情况不需要任何形式的更改跟踪,因此您仍然不必实现自己的更改跟踪。

票数 1
EN

Stack Overflow用户

发布于 2013-08-13 22:17:52

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

换句话说,实体框架所知道的对象将不会通过SaveChanges()传递,除非对对象上的属性进行实际更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18219794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档