2013-02-23 68 views
0

我目前正在使用Code first Entity框架(5.0)制作ASP.NET MVC4应用程序。这是我第一个使用ASP.NET MVC和Entity框架的项目,所以我对一些细节感到不知所措。该应用程序处理出纳员在超市的交易。实体框架约束保持并发调用的值为正

为了在超市进行销售,我有一个可用产品清单和每个可用的金额。正如逻辑所指出的那样,任何时候都不应该有一个给定产品的负数 - 所以我的问题是,我怎样才能以最好的方式解决并发问题?当发生这种情况可能出现

问题:

我们有4个香蕉可用。 收银员A试图出售2香蕉。 收银员B试图同时销售3个香蕉。 如果两个事务都通过,数据库将保留-1香蕉并处于无效状态。

那么防止这种情况的最好方法是什么?我试图找到几个选项,但我不知道选择哪一个或者它们是否合适:

  1. 添加一个Rowversion列,以便每个事务只在没有更改时才进行数据库。我在这里看到的问题是,在同一时刻可能会有很多交易,我不知道是否这样严格的支票(每当另一个收银员进行交易时都会返回一个错误)是值得的,因为我们只需要保留金额正面。即每天可能只有1-2笔交易导致问题,收银员将不得不重新检查其销售额。
  2. 在事务中的每个SaveChanges之后执行检查,如果项目数量无效,则回滚。

任何帮助将不胜感激!

回答

0

这个约束在数据库中更容易实施。映入脑海2个选项是(我用第二个去):

  1. 做一个存储过程中的更新,可以检查结果计数> = 0
  2. 添加列约束的列必须> = 0
+0

第二种选择看起来不错,但我找不到办法做到这一点。如果savechanges()在值<0时抛出一个异常,那就完美了。 但是我怎样才能使用代码优先添加列约束?范围似乎没有在数据库级别做任何事情作为约束。我必须手动添加它,以及如何? 感谢您的帮助! – LTsonov 2013-02-24 09:58:37

+0

您可能会在Customizing Migrations下找到您需要的地址http://msdn.microsoft.com/en-US/data/jj591621。另一种选择是运行一些自定义DDL来生成约束。 – qujck 2013-02-24 10:30:00

+0

显然,Code-first目前不支持通过Annotations检查约束。 到目前为止,我想出唯一的办法就是你提出的一个:写DDL自己在基于代码的迁移,因为这: SQL(“ALTER TABLE CashDesk添加约束CK_Positive_Money_Amount CHECK(AvailableAmount> = 0) “); 感谢您的协助! – LTsonov 2013-02-24 11:05:16