Entity Framework 4 - ApplyCurrentValues <TEntity> против ObjectStateManager.ChangeObjectState
У нас есть служба WCF с методом обновления, который обновляет клиента в БД. Этот метод получает отделенную сущность от клиента.
void UpdtaeCustomer(Customer detachedCustomer);
Мы придумали два способа написания этого метода:
1)
context.CustomerSet.Attach(detachedCustomer);
context.ObjectStateManager.ChangeObjectState(detachedCustomer, entityState.Modified);
context.SaveChanges();
2)
Customer customer = context.GetObjectByKey(detachedCustomer.EntityKey);
context.ApplyCurrentValues<Customer>("CustomerSet", detachedCustomer);
context.SaveChanges();
Мы хотим рассмотреть недостатки каждого метода. Первый из них имеет явное преимущество в том, что у него есть только одна поездка в БД. Но каковы плюсы второго метода. (или, может быть, они не действуют одинаково)?
1 ответ
Используйте первый подход. Нет никакого общего преимущества в использовании второго метода с отсоединенной сущностью, наоборот, это может ухудшить ситуацию.
Предположим, что вы используете метку времени. Метка времени - это специальный тип БД, представляющий версию строки. Каждый раз, когда запись в базе данных изменяется, отметка времени автоматически увеличивается. Временная метка используется для одновременных проверок, а при использовании с EF она обрабатывается как Computed
колонка. Каждый раз, когда EF хочет обновить запись, он сравнивает отметку времени в базе данных с отметкой времени, полученной вами при загрузке объекта (должна передаваться в вашей сущности клиенту и обратно). Если временные метки совпадают, запись сохраняется. Если они различаются, выдается исключение.
Разница между этими двумя методами заключается в том, что первый метод использует метку времени от отдельного объекта, тогда как второй метод использует метку времени от загруженного объекта. Причиной является вычисляемый столбец. Вычисленные значения не могут быть обновлены в приложении.