Entity Framework 4 - ApplyCurrentValues ​​<TEntity> против ObjectStateManager.ChangeObjectState - PullRequest
6 голосов
/ 05 апреля 2011

У нас есть служба 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 Ответ

7 голосов
/ 05 апреля 2011

Используйте первый подход. Нет никакого общего преимущества в использовании второго метода с отсоединенной сущностью, наоборот, это может ухудшить ситуацию.

Предположим, вы используете метку времени. Метка времени - это специальный тип БД, представляющий версию строки. Каждый раз, когда запись в базе данных изменяется, отметка времени автоматически увеличивается. Отметка времени используется для одновременных проверок, а при использовании с EF она обрабатывается как столбец Computed. Каждый раз, когда EF хочет обновить запись, он сравнивает отметку времени в базе данных с отметкой времени, полученной вами при загрузке объекта (должна передаваться в вашей сущности клиенту и обратно). Если временные метки совпадают, запись сохраняется. Если они отличаются, выдается исключение.

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

...