Я применяю столбец rowVersion для решения проблем параллелизма.Чтобы проверить эти изменения, я запускаю свое приложение и открываю две разные вкладки.На первой вкладке я редактирую поле, затем на второй вкладке я редактирую поле.Затем я сохраняю изменения в первом браузере и получаю исключение DBUPdateConcurrency
.Даже если я закрою другую вкладку и просто внесу изменения в первом браузере, он все равно возвращает исключение DBUPdateConcurrency
.Пожалуйста, смотрите код ниже:
Класс
public int CustomerID { get; set; }
public string Comment { get; set;}
[Timestamp]
public byte[] RowVersion { get; set; }
Контроллер
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(CustomerDetail model)
{
if (ModelState.IsValid)
{
int customerID = model.CustomerID;
string comment = model.Comment;
byte[] rowVersion = model.RowVersion;
using (BusinessLogicLayer BLL = new BusinessLogicLayer())
{
try
{
Customer customer =
BLL.GetSingleCustomer(customerID);
BLL.customerDB_entity.Entry(customer)
.OriginalValues["RowVersion"] = rowVersion;
BLL.UpdateCustomer(customerID);
BLL.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var databaseEntry = entry.GetDatabaseValues();
if (databaseEntry == null)
{
ModelState.AddModelError(
string.Empty,
"Unable to save changes. The field was deleted by another user.");
}
else
{
ModelState.AddModelError(
string.Empty,
"Unable to save changes. The field was updated by another user.");
}
}
return RedirectToAction("Edit", new { customerID });
}
}
return View(ViewModelManager.createEditViewModel(model.CustomerID));
}
Также я добавил свой скрытыйполе для версии строки в представлении:
@Html.HiddenFor(model => Model.RowVersion)