Entity framework 如何在实体框架5中实现inc/dec多用户安全

Entity framework 如何在实体框架5中实现inc/dec多用户安全,entity-framework,tsql,Entity Framework,Tsql,递增或递减整型字段的干净、安全的方法是什么 我将sql server 2012与entityframework 5.x结合使用 我寻找一个与互锁递增/递减等价的方法。标准方法是使用乐观并发 比如说,您有一个简单的实体,其中有一个整数字段计数器,您希望递增或递减: 公共类实体 { 公共int-SomeEntityId{get;set;} 公共int计数器{get;set;} } 您可以将计数器标记为并发令牌。使用Fluent API,它是: modelBuilder.Entity() .Prop

递增或递减整型字段的干净、安全的方法是什么

我将sql server 2012与entityframework 5.x结合使用


我寻找一个与互锁递增/递减等价的方法。

标准方法是使用乐观并发

比如说,您有一个简单的实体,其中有一个整数字段
计数器
,您希望递增或递减:

公共类实体
{
公共int-SomeEntityId{get;set;}
公共int计数器{get;set;}
}
您可以将
计数器标记为并发令牌。使用Fluent API,它是:

modelBuilder.Entity()
.Property(s=>s.Counter)
.IsConcurrencyToken();
然后,您可以增加或减少
计数器
,例如:

public void IncDecCounter(int-sometentityid,bool-dec)
{
使用(var context=new MyContext())
{
var someEntity=context.SomeEntities.Find(someEntityId);
if(someEntity!=null)
{
布尔保存失败;
做
{
saveFailed=false;
国际单项体育联合会(12月)
--某个实体。计数器;
其他的
++某个实体。计数器;
尝试
{
SaveChanges();
}
catch(dbupdateconcurrency异常)
{
saveFailed=true;
e、 Entries.Single().Reload();
}
}while(saveFailed);
}
}
}
SaveChanges
如果加载实体时
Counter
的值(在本例中,使用
Find
可以是任何其他查询),则
SaveChanges
将因
DbUpdateConcurrencyException
而失败与在数据库中执行UPDATE语句时数据库中的
计数器的值不同,这意味着
计数器
同时已被其他用户修改。从技术上讲,这是通过生成的UPDATE语句的扩展
WHERE
子句来实现的,该子句不仅尝试通过Id,还尝试通过
Counter
的旧值进行过滤,基本上类似于:
其中SomeEntityId=SomeEntityId,Counter=oldCounterWhenTityHasnoladed


catch
块使用数据库中当前的
计数器
值重新加载实体,下一个循环尝试再次递增或递减重新加载的值,直到成功,而不会出现并发冲突。

谢谢。;-)希望它足够快(;@Slauma,这段代码在哪里调用?
modelBuilder.Entity().Property(s=>s.Counter).IsConcurrencyToken();
您的解决方案在EF6/6.1中仍然有效吗?最后一件事:)-您将如何处理这个问题?我没有得到英孚明智的答案。。。