缓存DbContext.Entry(实体)

时间:2018-02-05 08:29:06

标签: c# entity-framework dbcontext

我在“存储库”中有以下代码:

 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个项目称为SaveSlow

EF 4.3.1

在00h:00m:00s.09ms

中创建了1000个项目

在00h:00m:48s.21ms

中调用保存1000个项目

在00h:00m:00s.06ms

中创建了1000个项目

在00h:01m:00s.20ms

中将1000个项目称为SaveSlow

0 个答案:

没有答案