插入注自动插入产品-此类情况下的最佳实践
本文关键字:插入 情况下 最佳 | 更新日期: 2023-09-27 18:05:28
我想知道这种情况下的最佳实践是什么。我用EF4.
我有两个实体,分别叫"Note"answers"Product"。我有另一个实体叫"股票"。
Note有许多产品,每个产品只能在一个Note中(Product必须有一个Note)。
每当我插入、删除或更新产品时,我都必须根据附在产品上的注释更新相关的Stock实体。
在InsertProduct()方法中,我插入Product,然后更新相关的Stock。如果产品将打破股票规则-我得到一个异常,操作将中止。
在InsertNote()方法中,我不能插入Note,因为这样会自动插入附加的Products,对于每个Product,我需要更新Stock并验证Stock规则(如上所述)。因此,在插入Note之前,我循环遍历所有product并调用InsertProduct()。然后我插入注释。
直到这里两个问题:
-
事情应该是这样的吗?我需要手动插入吗在我插入Note之前?这个怎么解决事实产品必须附在已存在的注(在时间)插入产品,没有插入Note)?
-
我应该把InsertNote()和InsertProduct()方法放在哪里?它们中的每一个都处理Note、Product和Stock实体。我是应该创建类似于NoteService和ProductService类的东西,还是应该将它们放在一个大的服务类中?
在我问这里的问题,我得到了一个答案,描述如何创建事件像OnBeforeInsert()。这个实现是与我的需要更新后插入产品的股票好吗?
我不太确定我完全理解您要做的事情以及验证股票规则和更新股票意味着什么。但似乎你试图重用InsertProduct从InsertNote当你不应该。
似乎InsertNote应该
- 检查所有规则并相应地更新Stock(我假设这意味着将股票从数据库加载到上下文中,或者如果你在内存中的某个地方有它们,则附加它们)
- 添加新的注释到上下文(将添加您之前放入其集合的新产品)
-
SaveChanges()
和InsertProduct应该
- 检查/更新上述库存
- 将Product添加到NoteProduct 集合中
-
SaveChanges()
换句话说,这两个方法都只重用规则检查部分。InsertProduct可能最好重命名为UpdateProductsOfNote,因为它听起来像Note是模型的聚合根(在DDD中,您对聚合执行持久化/存储库操作)。
至于这些方法的位置,如果它们不是太复杂,将它们添加到存储库/数据访问类(拥有EF上下文对象)中就可以了。看起来他们确实有很多与之相关的规则。如果是这样,某种域服务可能是更好的选择。似乎许多规则不仅仅是为了支持持久性。如果您重新定位这些方法,那么您可能不需要处理ObjectContext
事件,正如您在您引用的帖子中所要求的。