虽然在下面的代码中调试,但我发现forEach花费了大量时间,要从EntityState更改6000条记录的状态。未更改为EntityState。在我的本地开发环境中,此过程大约需要16分钟。
'where'表达式将过滤记录,而'update'表达式仅更新单个列。
我试图将ProxyCreationEnabled和LazyLoadingEnabled设置为false,但仍然需要花费相同的时间。有人可以帮助我了解此代码有什么问题。谢谢。
DbSet = Context.Set<T>();
...
...
public virtual int UpdateDB(Expression<Func<T, T>> update, Expression<Func<T, bool>> where)
{
var recordsUpdated = DbSet.Where(where).Update(update);
foreach (var e in DbSet.Where(where))
{
var state = Context.Entry(e).State;
Context.Entry(e).State = EntityState.Detached;
state = Context.Entry(e).State;
}
return recordsUpdated;
}
}
有人可以帮助我了解此代码出了什么问题。
当然。该代码很昂贵,没有任何意义。
此
var recordsUpdated = DbSet.Where(where).Update(update);
似乎正在从数据库中获取每一行并通过Update
函数运行。然后这个
foreach (var e in DbSet.Where(where))
正在从数据库中再次获取每一行,然后将它们都与被跟踪实体匹配,并返回被跟踪实体,而不是它刚刚从数据库中获取的那个实体。实体条目的状态被翻转为分离状态,并返回到之前的状态。您要完成什么?
如果要更新表中的每一行,请直接使用SQL。不要将它们全部获取给客户端,进行更改并将其保存回。