C# 实体框架并发控制使用;时间戳;值检查
对于并发控制,我在上下文类中编写了“VersionCheck”函数,需要动态加载上下文对象,并检查版本是否与当前上下文对象的版本相同。现在我使用switch语句。(代码如下) 还有,有没有更方便的版本控制方法 p、 RowVersion是数据库中的时间戳类型C# 实体框架并发控制使用;时间戳;值检查,c#,entity-framework,concurrency,ef-code-first,C#,Entity Framework,Concurrency,Ef Code First,对于并发控制,我在上下文类中编写了“VersionCheck”函数,需要动态加载上下文对象,并检查版本是否与当前上下文对象的版本相同。现在我使用switch语句。(代码如下) 还有,有没有更方便的版本控制方法 p、 RowVersion是数据库中的时间戳类型 public class SchoolContext : DbContext { public DbSet<Group> Groups { get; set; } public DbSet<Pers
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;
}
}
公共班级学校上下文:DbContext
{
公共数据库集组{get;set;}
公共DbSet Persons{get;set;}
public bool VersionCheck(字符串对象名)
{
var dbc=新学校上下文();
字节[]bt1=null;
字节[]bt2=null;
开关(objName)
{
案例“人”:
dbc.Persons.Load();
bt1=dbc.Persons.SingleOrDefault(p=>p.Id==1).RowVersion;
bt2=this.Persons.Local.SingleOrDefault(p=>p.Id==1).RowVersion;
打破
案例“组”:
dbc.Groups.Load();
bt1=dbc.Groups.SingleOrDefault(p=>p.Id==1).RowVersion;
bt2=this.Groups.Local.SingleOrDefault(p=>p.Id==1).RowVersion;
打破
}
如果(bt1==null&&bt2==null)
{
抛出新异常(“其中一个变量为null!”);
返回true;
}
对于(int i=0;i
所描述的方法看起来像是等待发生数据损坏。除非在读取和检查行版本期间锁定了行或表,否则在您读取该行或表以检查其值后,该行或表可能会更改 正确使用乐观并发范例 例如 所描述的方法看起来像是等待发生数据损坏。
除非在读取和检查行版本期间锁定了行或表,否则在您读取该行或表以检查其值后,该行或表可能会更改 正确使用乐观并发范例
你看过这个吗?你想达到什么目标?为什么有两个独立的数据库上下文?您是使用ConcurrencyCheckAttribute作为时间戳还是这是一个自定义解决方案?如果是的话,那么你的目标是什么?对不起,这是我的错误。我编辑代码。只有学校上下文。您必须使用上面描述的乐观并发。这是在更新时进行检查的唯一方法。您的方法总是为检查和实际更新之间的冲突留出空间。您看过这个吗?你想达到什么目标?为什么有两个独立的数据库上下文?您是使用ConcurrencyCheckAttribute作为时间戳还是这是一个自定义解决方案?如果是的话,那么你的目标是什么?对不起,这是我的错误。我编辑代码。只有学校上下文。您必须使用上面描述的乐观并发。这是在更新时进行检查的唯一方法。您的方法总是为检查和实际更新之间的冲突留出空间。