У меня есть контроллер OAP данных WebAPI, который использует Delta для частичного обновления моего объекта.Как вы используете оптимистичный параллелизм с контроллером OAP для WebAPI
В моей модели структуры сущности у меня есть поле Version. Это rowversion в базе данных SQL Server и сопоставляется с массивом байтов в Entity Framework с режимом параллелизма, установленным в Fixed (сначала используется база данных).
Я использую fiddler для отправки частичного обновления с использованием устаревшего значения для поля Version. Я загружаю текущую запись из своего контекста, а затем я исправляю мои измененные поля сверху, что изменяет значения в столбце «Версия», не вызывая ошибки, а затем, когда я сохраняю изменения в моем контексте, все сохраняется без ошибок. Очевидно, что ожидается, что объект, который сохраняется, не был удален из контекста, так как я могу реализовать оптимистичный параллелизм с Delta.
Я использую самые последние версии всего (или было как раз перед Рождеством), так Entity Framework 6.0.1 и 5.6.0 OData
public IHttpActionResult Put([FromODataUri]int key, [FromBody]Delta<Job> delta)
{
using (var tran = new TransactionScope())
{
Job j = this._context.Jobs.SingleOrDefault(x => x.JobId == key);
delta.Patch(j);
this._context.SaveChanges();
tran.Complete();
return Ok(j);
}
}
Благодарности
К сожалению, это не исправление. Он работает только в том случае, если запись изменяется в течение очень короткого промежутка времени между Post PostFromCtx1 = ctx1.Post.First (p => p.ID == 1); 'и' ctx1.SaveChanges(); '. Это фактически описано как анти-шаблон здесь: http://msdn.microsoft.com/en-us/magazine/dd882522.aspx. В моем сценарии «bob» загружает v1 записи, «jane» затем обновляет запись до v2, а через 20 минут «bob» пытается сохранить свой v1, который будет успешным. – BenCr
Тогда вам придется выполнять проверки параллелизма самостоятельно. Когда Боб пытается сохранить свой v1, он не добьется успеха, потому что обновление Джейн изменит метку времени от первоначального значения, которое удерживает Боб. –
Использование моего кода в вопросе Обновление Боба всегда преуспевает (за исключением очень редкого случая, когда два обновления происходят в секунду), потому что он загружает v2, а затем применяет его изменения к нему, поэтому контекст всегда обновляет свежий объект. Я предполагаю, что вопрос в том, как я сам реализую проверки параллелизма в этом «отключенном» сценарии. – BenCr