在Entity Framework中,EntityState.Detached使操作变慢

问题描述 投票:0回答:1

虽然在下面的代码中调试,但我发现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;                
            }

        }
c# entity-framework linq entity-framework-6 query-performance
1个回答
0
投票

有人可以帮助我了解此代码出了什么问题。

当然。该代码很昂贵,没有任何意义。

var recordsUpdated = DbSet.Where(where).Update(update);

似乎正在从数据库中获取每一行并通过Update函数运行。然后这个

foreach (var e in DbSet.Where(where))

正在从数据库中再次获取每一行,然后将它们都与被跟踪实体匹配,并返回被跟踪实体,而不是它刚刚从数据库中获取的那个实体。实体条目的状态被翻转为分离状态,并返回到之前的状态。您要完成什么?

如果要更新表中的每一行,请直接使用SQL。不要将它们全部获取给客户端,进行更改并将其保存回。

© www.soinside.com 2019 - 2024. All rights reserved.