在代码语言中使用其他术语。假设发票是从上下文中挑选的。
而不阻止任何更改,
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();
}现实更多的是关于复杂的数据库和几十万条记录。
我应该选择什么来优化过程?
发布于 2013-08-13 22:29:07
我什么都不会优化。EF自动跟踪变化,您将永远只想关闭他们。
Entity通过保留原始数据的副本来自动完成此操作,以便检测更改与否。但是,由于您询问的是优化,您可能应该阅读业绩考虑,特别是题为"5 NoTracking查询“的部分。
关闭更改跟踪是可能的,而且您必须按照原来问题中的要求进行操作(假设在这种情况下,您甚至会想要做这样的事情)。
在某些情况下,这可能是有用的,比如插入大量数据,因为更改跟踪相对较慢,在这种情况下,关闭更改跟踪可以获得非常显著的性能增益,只需将多分钟转换为数十秒。然而,这种情况不需要任何形式的更改跟踪,因此您仍然不必实现自己的更改跟踪。
发布于 2013-08-13 22:17:52
在实体框架中,上下文对象在内存中记录它正在跟踪的对象的状态。如果调用int numberOfItemsSaved = context.SaveChanges(),它将返回在调用SaveChanges时处于添加、修改或删除状态的对象数。SaveChanges()还重置所有对象的更改跟踪信息,因此在同一个函数中多次调用SaveChanges()可能会在第二个调用中显示一个0返回值。
换句话说,实体框架所知道的对象将不会通过SaveChanges()传递,除非对对象上的属性进行实际更改。
https://stackoverflow.com/questions/18219794
复制相似问题