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 хочет обновить запись, он сравнивает отметку времени в базе данных с отметкой времени, полученной вами при загрузке объекта (должна передаваться в вашей сущности клиенту и обратно). Если временные метки совпадают, запись сохраняется. Если они различаются, выдается исключение.

Разница между этими двумя методами заключается в том, что первый метод использует метку времени от отдельного объекта, тогда как второй метод использует метку времени от загруженного объекта. Причиной является вычисляемый столбец. Вычисленные значения не могут быть обновлены в приложении.

Другие вопросы по тегам