Обработка оптимистичного параллелизма - PullRequest
0 голосов
/ 03 декабря 2018

Я применяю столбец 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...