Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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# 为什么不';我不能得到一个EF5并发错误吗?_C#_Sql Server 2008_Entity Framework 5_.net 4.5 - Fatal编程技术网

C# 为什么不';我不能得到一个EF5并发错误吗?

C# 为什么不';我不能得到一个EF5并发错误吗?,c#,sql-server-2008,entity-framework-5,.net-4.5,C#,Sql Server 2008,Entity Framework 5,.net 4.5,在我处理的数据库中,该公司跟踪每个地区办事处的订单号。我有一个名为[Company]的表,每个地区办事处都有一条记录。此表有一个字段,用于保存该办公室的下一个可用订单号。所有订单均在单个[订单]表中创建。我意识到,在一个特定的办公室里,可能会有多个用户同时请求新订单。我已经为乐观并发做好了一切准备。[Company]表有一个名为RowModTracker的列,用于并发目的(有关EF和SQL中的所有属性,请参见底部的图片) 在下面的代码中,我获得了地区办事处的记录,增加了具有订单号的字段,并将副本

在我处理的数据库中,该公司跟踪每个地区办事处的订单号。我有一个名为[Company]的表,每个地区办事处都有一条记录。此表有一个字段,用于保存该办公室的下一个可用订单号。所有订单均在单个[订单]表中创建。我意识到,在一个特定的办公室里,可能会有多个用户同时请求新订单。我已经为乐观并发做好了一切准备。[Company]表有一个名为RowModTracker的列,用于并发目的(有关EF和SQL中的所有属性,请参见底部的图片)

在下面的代码中,我获得了地区办事处的记录,增加了具有订单号的字段,并将副本放入局部变量中。然后我马上把它从桌子上救了下来。我希望如果两个用户同时点击这个方法,第一个保存的用户将获得一个有效的订单号。我希望第二个保存的用户会得到一个乐观并发错误,并且应该返回null(这会导致提示,要求他们重试)。用户告诉我,在过去的八个月里,有几次他们确实收到了相同订单号的订单。在流程的后期,当他们去保存订单并且违反订单号的唯一约束时,才会出现任何消息和错误

我显然不了解EF并发性检查的一些基本知识,我希望有人能告诉我。我编写了一个测试版本的GetNextOrderNumberAndUpdate,其中我使用上下文将第二个包装在第一个周围,它确实生成了预期的并发错误。当两个不同的客户这样做时,这似乎不会发生

private int?TryToGetNextOrderNumber()
{
int?订单号;
bool keep_trying=true;
尽管(继续努力)
{
订单号=\u entityManager.GetNextOrderNumberAndUpdate();
如果(订单号!=null)返回订单号;
keep_trying=keeptrying forordernumbercompt();
}
返回null;
}
公共整数?GetNextOrderNumberAndUpdate()
{
尝试
{     
使用(var db_context=new HotEntities(EntityConnectionString))
{                   
var hss_company=db_context.companys.Find(hsscompanyuse.HssCompanyId);
int?next_order_num=++hss_company.NextOrderNum;
db_context.SaveChanges();
返回下一个订单号;
}
}
catch(DbUpdateConcurrencyException)
{
返回null;
}
捕获(例外情况除外)
{
return null;//实际代码也会发出警报
}
}

我正在使用EntityFramework5和SQLServer2008R2以及.NET4.5

编辑 测试版本是这样的,我省略了所有的try/catch元素,与上面的一样


我不太明白这一点:“我编写了GetNextOrderNumberAndUpdate的测试版本,在第一个版本周围使用上下文包装了第二个版本,它确实生成了预期的并发错误。当两个不同的客户端执行此操作时,它似乎不会发生。”这是否意味着您的客户端通常共享相同的上下文?不,我只是说从一个线程(实际上是一个测试方法)我写了一个测试,其中一个上下文被打开并抓取记录,然后在该线程中我打开另一个上下文并抓取相同的记录。在第二个上下文中,我修改了订单号并保存了记录。然后在第一个上下文中,我尝试用相同的更改再次保存记录。对SaveChanges()的第二次调用引发了并发错误。所以我认为我已经设置正确了。我不知道如何让不同的客户共享同一个上下文。我将发布测试版本以使其更清晰。
//Test force a failure 
using (HotEntities test_context = new HotEntities(EntityConnectionString))
{
    var test_hss_company = test_context.Companies.Find(HssCompanyInUse.HssCompanyId);
    int? test_next_order_num = ++test_hss_company.NextOrderNum;  
    //======= Normal Code ============
    using (var db_context = new HotEntities(EntityConnectionString))
    {
        var hss_company = db_context.Companies.Find(HssCompanyInUse.HssCompanyId);
        var next_order_num = ++hss_company.NextOrderNum;
        db_context.SaveChanges();
        return next_order_num;
    }
    //======= End Normal Code ============

test_context.SaveChanges(); //DbUpdateConcurrencyException exception would get thrown here
} //end for test using