答案 0 :(得分:2)
实体框架在你(作为开发人员)将其配置为检查并发性问题之前,并没有对并发性做任何特殊处理。
您正在尝试捕获DbUpdateConcurrencyException,此异常的文档说:“当预期实体的SaveChanges将导致数据库更新但实际上没有行中的DbContext时抛出异常数据库受到影响。“,您可以阅读here
在数据库第一种方法中,您必须为'Fixed'上的列设置属性'Concurrency Mode'(默认为None)。请看这个屏幕截图:
列版本是SQL SERVER TIMESTAMP类型,这是一种特殊类型,每次更改行时都会自动更新,请阅读here。
使用此配置,如果所有操作都按预期工作,您可以尝试使用此简单测试:
try
{
using (var outerContext = new testEntities())
{
var outerCust1 = outerContext.Customer.FirstOrDefault(x => x.Id == 1);
outerCust1.Description += "modified by outer context";
using (var innerContext = new testEntities())
{
var innerCust1 = innerContext.Customer.FirstOrDefault(x => x.Id == 1);
innerCust1.Description += "modified by inner context";
innerContext.SaveChanges();
}
outerContext.SaveChanges();
}
}
catch (DbUpdateConcurrencyException ext)
{
Console.WriteLine(ext.Message);
}
在上面的示例中,将提交内部上下文的更新,来自外部上下文的更新将抛出DbUpdateConcurrencyException,因为EF将尝试使用2列作为过滤器更新实体:Id和Version列。
希望这有帮助!