首页 > 解决方案 > 在 DDD 聚合中保持“当前余额”

问题描述

在库存系统上工作。

使用 C# 和实体框架。

一个StockItem将有许多StockMovementStockMovement可以是购买、销售、退货、浪费等。

因此,一个StockItem有一个StockLevel

StockItem维护StockLevel的最佳方法是什么?

一种方法是在查询 StockItem 时对所有StockMovements进行求和,但如果StockMovements的数量变得过多,则在StockItem上维护一个StockLevel并在每次添加 StockMovement 时对其进行调整似乎更好

但是,如果两个单独的客户端同时处理StockMovement,则可能同时实现StockItem的两个实例(即都显示 100 个单位的余额)。

客户端 1 删除了 10 个单位,客户端 2 也删除了 10 个单位,但是在更新StockLevel时,两个StockItem实例都会将新的StockLevel调整为 90,这是错误的。应该是80。

因此,使用乐观并发似乎是一种选择,但我不想将其推回给用户。

应用程序层捕获并发异常然后代表客户端重试是否有意义,或者我应该采用什么更好的模式?

标签: c#entity-framework-coredomain-driven-design

解决方案


使用 EF Core 的并发令牌

标记StockLevel[ConcurrencyCheck],捕获DbUpdateConcurrencyException解决并发冲突中所示


推荐阅读