ObjectStateManager vs ApplyCurrentValues ​​при обновлении объекта? - PullRequest
0 голосов
/ 12 января 2012

Я знаю, что использование ObjectStateManager просто приводит к 1 поездке в базу данных, но больший оператор обновления и ApplyCurrentValues ​​приводит к 2 поездкам в базу данных, одна для получения объекта и одна для его обновления, так каковы плюсы и минусыо том, как при выполнении следующего оператора узнать, что я хочу обновить эту текущую запись, я знаю, что это как-то связано с загрузкой ее в контекст, но не уверен, как она работает.

[HttpPost]
public ActionResult Edit(Movie movie)
{

    (from m in _db.Movies1
     where m.Id == movie.id
     select m).First()

     //How does calling the above query know to update the movie, 
       can't I do it with out it?
     _db.Movies1.ApplyCurrentValues(movie);
     _db.SaveChanges();

}

1 Ответ

0 голосов
/ 12 января 2012

Код, который вы опубликовали, «знает», что вы хотите обновить запись, потому что он предполагает, что если состояние изменено (которые applycurrentvalues ​​помечает свойства как измененные), то вы должны обновить это поле.

Таким образом, все, что изменяется, устанавливается, а затем отправляется в базу данных. Однако код, в котором есть .First (), не делает здесь ничего полезного.

ApplyCurrentValues ​​ничего не загружает, поэтому ваша первая строка кода загружает это в контекст. Затем вы ApplyCurrentValues ​​объединяет значения в него. Все, что отличается, помечается как измененное и копируется, после чего эти поля отправляются в БД для обновления.

Вы можете профилировать деятельность, проверить http://msdn.microsoft.com/en-us/magazine/gg490349.aspx

также есть хороший профилировщик демпфера, доступный на http://efprof.com/

Другой вариант - просто прикрепить измененные и сохранить изменения. Я думаю, что это даст только один запрос (обновление базы данных), мне придется перепроверить это. Этот код будет выглядеть так:

_db.Entry(movie).State = EntityState.Modified; //attaches is as well
_db.SaveChanges();

Это сохранит каждое свойство, но я думаю, что это может быть на одну поездку меньше (обновление, перезагрузка, а не загрузка, обновление, перезагрузка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...