Как сущность обрабатывает кого -то, меняющего данные под мной (транзакции)
-
26-10-2019 - |
Вопрос
Скажите, есть следующий код:
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()
?
И как кто -либо из них может знать, какие ряды мне нужны в транзакции. (То, что я читаю строку, не означает, что я хочу, чтобы она заблокировала. Или он блокирует все таблицы в модели (Yuck)).
Примечание: я работаю с SQL Server 2008 R2 и EF 4.1
Решение
По умолчанию, да, это будет перезаписать измененные записи. Если вы беспокоитесь об этом для своего приложения, прочитайте это:
http://msdn.microsoft.com/en-us/library/bb738618.aspx
По умолчанию структура сущности реализует оптимистичную модель параллелизма. Это означает, что блокировки не хранятся на данных в источнике данных между при запрос данных и обновления данных. Структура сущности сохраняет изменения объекта в базу данных без проверки параллелизма. Для организаций, которые могут испытывать высокую степень параллелизма, мы рекомендуем, чтобы организация определила свойство в концептуальном уровне с атрибутом complunrencyMode = "Исправлено" ..... (перейдите по ссылке, чтобы узнать больше)