对于并发控制我在我的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;
}
}
答案 0 :(得分:1)
Optimistic concurrency explained
所描述的方法看起来像数据腐败等待发生 除非您在阅读和检查rowversion期间锁定行或表,否则在读取它以检查其值后它可能会更改。
正确使用乐观并发范例。