Model First方法中的EF Concurrency Handling with Timestamp属性

esc*_*ist 5 .net optimistic-concurrency entity-framework-4

我试图在ASP.NET MVC应用程序中实现使用Entity Framework处理并发中给出的解决方案.

文章说:

将跟踪属性添加到部门实体

在Models\Department.cs中,添加一个跟踪属性:

[Timestamp] 
public Byte[] Timestamp { get; set; }
Run Code Online (Sandbox Code Playgroud)

Timestamp属性指定此列将包含在发送到数据库的Update和Delete命令的Where子句中.

由于我使用的是模型第一种方法,因此我遵循了使用Entity Framework创建时间戳列中概述的步骤1 - 5

  1. 将名为"Timestamp"的属性添加到EF模型中的实体
  2. 将类型设置为二进制
  3. 将nullable设置为false
  4. 将StoreGeneratedPattern设置为Computed
  5. 将ConcurrencyMode设置为Fixed

当我从数据库模型更新我的代码时,Models\Department.cs现在包含

    public virtual byte[] Timestamp
    {
        get;
        set;
    }
Run Code Online (Sandbox Code Playgroud)

然后我使用元数据类来指定Timestamp属性:

// Metadata for Department entity
public class DepartmentMetadata
{
    [Timestamp]
    public byte Timestamp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Q1.Timestamp在行编辑的情况下,我测试了列的值是否发生了变化.事实并非如此.

编辑1问题是由于SQL Server列类型binary,它应该是类型的原因引起的timestamp.更改数据类型修复了Timestamp列未更新的问题.

Q2.我试图修改同一个实体(使用"在新标签页中打开")来查看是否OptimisticConcurrencyException抛出了一个实体.事实并非如此.我究竟做错了什么?请帮助我理解,谢谢.

我的<code> Timestamp </ code>属性的屏幕截图

esc*_*ist 3

引起该问题的原因是每个 HTTP 会话都有一个 ObjectContext,因此打开一个新选项卡并测试它不会导致并发异常。