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