В Entity Framework EntityState.Detached замедляет работу - PullRequest
0 голосов
/ 25 мая 2020

При отладке кода ниже я обнаружил, что forEach занимает значительное время, а для изменения состояния 6000 записей с EntityState.Unchanged на EntityState.Detached в моей локальной среде разработки требуется около 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;                
            }

        }

1 Ответ

1 голос
/ 26 мая 2020

Что не так с этим кодом?

Этот код дорогой и бессмысленный.

Этот

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

выглядит выборка каждой строки из базы данных и выполнение функции Update. Затем этот

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

извлекает каждую строку из базы данных снова , но сопоставляет их все с отслеживаемыми объектами и возвращает отслеживаемый объект, а не тот, который он только что получил из базы данных . Состояние записи объекта меняется на отсоединенное и возвращается к тому, что было раньше.

Что вы пытаетесь выполнить sh?

Если вы хотите обновить каждую строку в таблице, используйте SQL напрямую. Не передавайте их все клиенту, измените их и сохраните обратно.

...