C # оптимистичный параллелизм не отвечает - PullRequest
1 голос
/ 03 мая 2019

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

К сожалению, приложение работает так, как будто я ничего не изменил. Я открываю два браузера, в обоих я редактирую одну и ту же строку, перезаписываю одно и то же значение и помещаю его в первый, а другой не отвечает вообще. Я спасу второй и до сих пор без предупреждения. Я попытался пройти через это, и с кнопкой редактирования и когда сохранено, RowVersion меняет меня. Только SaveChanges() не выдает исключение.

SQL-сервер:

CREATE TABLE [dbo].[Table] (
    [Id]         INT            IDENTITY (1, 1) NOT NULL,
    [RowVersion] ROWVERSION     NULL,
...

Модель:

public partial class Table
{
    public int Id { get; set; }

    [Column(TypeName = "timestamp")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [MaxLength(8)]
    public byte[] RowVersion { get; set; }

Контроллер:

[HttpPost]
public ActionResult Table_Edit([Bind(Include = "Id,RowVersion")]Table tab)
{
    try
    {
        if (ModelState.IsValid)
        {
            db.Entry(tab).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (DbUpdateConcurrencyException ex)
    {
        var entry = ex.Entries.Single();
        Table clientValues = (Table)entry.Entity;
        Table  databaseValues = (Table )entry.GetDatabaseValues().ToObject();
        //changed column
        if (databaseValues.Column_5 != clientValues.Column_5)
            ModelState.AddModelError("Name", "Current value: "
                + databaseValues.Column_5);

        ModelState.AddModelError(string.Empty, "The record you attempted to edit "
            + "was modified by another user after you got the original value. The "
            + "edit operation was canceled and the current values in the database "
            + "have been displayed. If you still want to edit this record, click "
            + "the Save button again. Otherwise click the Back to List hyperlink.");
        tab.RowVersion = databaseValues.RowVersion;
    }

    catch (DataException /* dex */)
    {
        //Log the error (uncomment dex variable name after DataException and add a line here to write a log.
        ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator.");
    }
    return View(tab);
}
...