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

时间:2012-05-21 09:23:38

标签: .net entity-framework-4 optimistic-concurrency

我正在尝试实施Handling Concurrency with the Entity Framework in an ASP.NET MVC Application 中提供的解决方案。

文章说:

  

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

     

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

[Timestamp] 
public Byte[] Timestamp { get; set; }
     

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

由于我使用模型优先方法,因此我按照Creating a Timestamp column with Entity Framework

中概述的步骤1 - 5进行操作
  1. 将名为“Timestamp”的属性添加到EF模型中的实体
  2. 将类型设置为二进制
  3. 将nullable设为false
  4. 将StoreGeneratedPattern设置为Computed
  5. 将ConcurrencyMode设置为Fixed
  6. 当我从数据库模型更新代码时,Models \ Department.cs现在包含

        public virtual byte[] Timestamp
        {
            get;
            set;
        }
    

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

    // Metadata for Department entity
    public class DepartmentMetadata
    {
        [Timestamp]
        public byte Timestamp { get; set; }
    }
    

    Q1。我测试了Timestamp列的值是否在行编辑时发生了变化。它不是。

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

    Q2。我试图修改同一个实体(使用"在新标签中打开")以查看是否抛出了OptimisticConcurrencyException。它不是。我究竟做错了什么?请帮助我理解,谢谢。

    Screenshot of my <code>Timestamp</code> property

1 个答案:

答案 0 :(得分:3)

问题是由于每个HTTP会话都有一个ObjectContext,因此打开一个新选项卡并测试它会 NOT 导致并发异常。