Как структура сущностей обрабатывает изменение данных подо мной (транзакции) - PullRequest
0 голосов
/ 01 декабря 2011

Скажем, есть следующий код:

public void SaveOrUpdate(OrderContract orderContract)
{
   foreach (var orderContract in orderContract.Tests)
   {

      Order order=dataAccess.FindOne<Order>(x=>x.OrderId==orderContract.OrderId) 
                  ?? new Order();

      // Where there are updates, put the stuff in the 
      // contract over what we already had.
      Mapper.Map(orderContract, order);

       // if it is new then add it in so it is inserted by EF.
      if (orderedTest.OrderedTestId <= 0)
          dataAccess.Add(orderedTest);

   }
   dataAccess.SaveChanges();
}

Есть ли у EF что-нибудь, что будет заботиться, если кто-то обновит заказ после того, как я его получу (при вызове FindOne?

Илион просто с радостью перезаписывает любые изменения, которые были сделаны между извлечением данных и моим вызовом SaveChanges?

Если этого не произойдет, то будет ли лучше защитить меня вызов ObjectContext.Connection.BeginTransaction?я должен использовать new TransactionScope()?

И как любой из них может узнать, какие строки мне нужно иметь в транзакции. (То, что я читаю строку, не означает, что я хочу заблокировать ее. Или она блокируетсявсе таблицы в модели (фу)).

Примечание. Я работаю с SQL Server 2008 R2 и EF 4.1

1 Ответ

0 голосов
/ 01 декабря 2011

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

http://msdn.microsoft.com/en-us/library/bb738618.aspx

По умолчанию Entity Framework реализует оптимистическую модель параллелизма. Это означает, что блокировки данных в источнике данных не удерживаются между моментом запроса данных и обновления данных. Entity Framework сохраняет изменения объекта в базе данных без проверки на параллелизм. Для объектов, которые могут иметь высокую степень параллелизма, мы рекомендуем, чтобы объект определял свойство в концептуальном слое с атрибутом ConcurrencyMode = "fixed" ..... (перейдите по ссылке, чтобы узнать больше)

...