实体框架并发控制使用“Timestamp”值检查

时间:2013-12-12 14:13:42

标签: c# entity-framework concurrency ef-code-first

对于并发控制我在我的Context类中编写“VersionCheck”函数,我需要动态加载Context对象并检查版本是否与当前上下文对象RowVersion相同。现在我使用switch语句。 (以下代码) 还有,还有更方便的版本控制方式吗?

P.S。 RowVersion是数据库中的TimeStamp类型。

  public class SchoolContext : DbContext
  {
    public DbSet<Group> Groups { get; set; }
    public DbSet<Person> Persons { get; set; }

    public bool VersionCheck(string objName)
    {
        var dbc = new SchoolContext();
        byte[] bt1 = null;
        byte[] bt2 = null;

        switch (objName)
        {
            case "Person":
                dbc.Persons.Load();
                bt1 = dbc.Persons.SingleOrDefault(p => p.Id == 1).RowVersion;
                bt2 = this.Persons.Local.SingleOrDefault(p => p.Id == 1).RowVersion;
                break;
            case "Group":
                dbc.Groups.Load();
                bt1 = dbc.Groups.SingleOrDefault(p => p.Id == 1).RowVersion;
                bt2 = this.Groups.Local.SingleOrDefault(p => p.Id == 1).RowVersion;
                break;
        }

        if (bt1 == null && bt2 == null)
        {
            throw new Exception("One of the Variable is null!");
            return true;
        }
        for (int i = 0; i < bt1.Length; i++)
        {
            if (bt1[i] != bt2[i])
            {
                MessageBox.Show("Current object changed!");
                return false;
            }
        }
        return true;
    }

 }

1 个答案:

答案 0 :(得分:1)

Optimistic concurrency explained

所描述的方法看起来像数据腐败等待发生 除非您在阅读和检查rowversion期间锁定行或表,否则在读取它以检查其值后它可能会更改。

正确使用乐观并发范例。

例如https://stackoverflow.com/a/14718991/1347784