【问题标题】:What is the best way to prevent overlapping events in an MVC EF App?在 MVC EF 应用程序中防止重叠事件的最佳方法是什么?
【发布时间】:2012-03-05 11:16:06
【问题描述】:

我有一个使用 EF Database First 的 MVC3 应用程序。该应用程序记录与汽车相关的各种事件。事件不允许重叠。事件是从一组基于 ViewModel 的标准 CRUD 屏幕创建和添加的。然后通过一个服务将它们添加到上下文中,该服务只是通过事件存储库插入它们。

人们正在为汽车创建租用期。因此,我需要防止汽车有重叠的租用期,因为一次只有一个人可以租用汽车。

验证不能创建重叠事件的最佳方法是什么?放置此逻辑的最佳位置在哪里。我假设在域层中,因此可以重用核心逻辑。这属于存储库还是应该在实体本身上实现?这是一个多用户系统,所以我需要防止两个人同时添加事件导致重叠问题。

任何建议表示赞赏。

谢谢

格雷姆

【问题讨论】:

  • 我想,我们需要更多细节,你所说的重叠事件是什么意思。在一个网络应用程序中,两个用户做同样的事情是很正常的。您是否要确保 2 个用户不能发送相同的事件,其中该事件是域概念而不是 .net 概念?
  • 我认为这是应用领域事件和事件溯源模式的完美案例。 Udi Dahan 和 Greg Young 都有很多关于它的帖子和演示。
  • 已更新以提供域的详细信息
  • “重叠事件”是什么意思?
  • 事件有开始日期和结束日期。两个事件不应占用相同的时间。

标签: asp.net-mvc asp.net-mvc-3 entity-framework domain-driven-design


【解决方案1】:

好的,我认为数据库中的基本唯一约束就足够了。如果碰巧有 2 个用户预订了同一辆车,那么数据库应该拒绝该交易,因为它会违反约束。我认为密钥可以放在 Booked 列或类似的地方。

数据库将抛出一个异常,存储库应该捕获它并最终引发域事件 OverlappedBookingEvent 可能会处理用户错误消息“我们很抱歉,但与此同时其他人预订了那辆车'。

虽然是一个业务规则,但我认为这个检查最多只能在存储库级别进行,因为它是一个与持久性相关的规则,最终只有数据库才能执行它。

【讨论】:

  • 数据库是否必须获取所有雇佣事件(包括开始日期和结束日期)并确保它们不重叠?
  • 这是唯一可以在数据库中验证的地方。我猜人们的上下文不共享上下文,所以如果我们不在数据库级别执行,两个人可以同时添加重叠的员工?
  • 任何请求都是独立的,是的,可能会发生 2 个用户在几乎(1 毫秒之外)同时预订同一辆车。 db 是数据完整性的最后守护者。
猜你喜欢
  • 1970-01-01
  • 2012-11-13
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多