Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架并发控制使用;时间戳;值检查_C#_Entity Framework_Concurrency_Ef Code First - Fatal编程技术网

C# 实体框架并发控制使用;时间戳;值检查

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

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

p、 RowVersion是数据库中的时间戳类型

  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作为时间戳还是这是一个自定义解决方案?如果是的话,那么你的目标是什么?对不起,这是我的错误。我编辑代码。只有学校上下文。您必须使用上面描述的乐观并发。这是在更新时进行检查的唯一方法。您的方法总是为检查和实际更新之间的冲突留出空间。