我在“存储库”中有以下代码:
if (DbContext.Entry(item) == null || DbContext.Entry(item).State == EntityState.Detached)
{
DbContext.Set<T>().Attach(item);
DbContext.Entry(item).State = EntityState.Modified;
}
它使用DbContext.Entry(item)
三次来检查实体是否应被视为已修改。
现在,DbContext.Entry(item)
非常慢,特别是在调用它数百次时,所以我想要缓存条目:
var dbEntityEntry = DbContext.Entry(item);
if (dbEntityEntry == null || dbEntityEntry.State == EntityState.Detached)
{
DbContext.Set<T>().Attach(item);
dbEntityEntry.State = EntityState.Modified;
}
根据探查器的说法,这一改变使得整个代码的速度提高了50%。 但我在EF源代码中看到,在调用.Entry()时会创建一个新的DbEntityEntry实例。
public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class
{
RuntimeFailureMethods.Requires((object) entity != null, (string) null, "entity != null");
return new DbEntityEntry<TEntity>(new InternalEntityEntry(this.InternalContext, (object) entity));
}
所以我的问题是,每次调用Entry()是一个好习惯吗? 或者它是否更好地缓存它,即使它没有性能影响?
我使用的EF版本是4.3.1。
随后:
我使用EF 6.2.0制作了一个模型项目,我使用两种方法,Save,使用缓存的DbEntityEntry和SaveSlow,不使用缓存。
EF 6.2.0
在00h:00m:00s.10ms
中创建了1000个项目在00h:00m:21s.82ms
中调用保存1000个项目在00h:00m:00s.06ms
中创建了1000个项目在00h:00m:25s.18ms
中将1000个项目称为SaveSlowEF 4.3.1
在00h:00m:00s.09ms
中创建了1000个项目在00h:00m:48s.21ms
中调用保存1000个项目在00h:00m:00s.06ms
中创建了1000个项目在00h:01m:00s.20ms
中将1000个项目称为SaveSlow