【问题标题】:insert note automatically insert product - best practice for such cases?插入注释自动插入产品 - 这种情况的最佳实践?
【发布时间】:2011-08-14 22:58:24
【问题描述】:

我问是为了了解这种情况下的最佳做法是什么。我正在使用 EF4。

我有两个实体,分别称为“Note”和“Product”。我有另一个名为“Stock”的实体。
Note 有很多产品,每个产品只能在一个 Note 中(产品必须有一个 Note)。
每当我插入、删除或更新产品时,我都必须根据产品附带的注释更新相关的 Stock 实体。

在 InsertProduct() 方法中,我插入 Product,然后更新相关 Stock。万一产品违反了库存规则 - 我得到一个例外,操作将按原样中止。

在 InsertNote() 方法中,我无法插入注释,因为这样的东西会自动插入附加的产品,并且对于每个产品,我需要更新 Stock 并验证 Stock 规则(如上所述)。因此,在插入注释之前,我会遍历所有产品并调用 InsertProduct()。之后我插入注释。

直到这里有两个问题:

  1. 事情应该是这样的吗?是否需要手动插入 每个产品在我插入注释之前?这如何解决 fact 产品必须附加到存在注释(在 插入产品,注释没有插入)?

  2. 我应该把 InsertNote() 和 InsertProduct() 方法放在哪里? 它们中的每一个都处理 Note、Product 和 Stock 实体。我应该创建类似 NoteService 和 ProductService 类的东西,还是应该将它们放在一个大服务类中?

在我问here 的问题中,我得到了一个描述如何创建像 OnBeforeInsert() 这样的事件的答案。这个实现是否适合我在插入产品后更新库存的需要?

【问题讨论】:

    标签: c# .net entity-framework design-patterns entity-framework-4


    【解决方案1】:

    我不太确定我是否完全理解您想要做什么以及验证 Stock 规则和更新 Stock 意味着什么。但您似乎在尝试重用 InsertNote 中的 InsertProduct,而您不应该这样做。

    似乎 InsertNote 应该

    • 检查所有规则并相应地更新 Stock(我假设这意味着将股票从数据库加载到上下文中,或者如果您在内存中的某处将它们附加到上下文中)
    • 将新的Note添加到上下文中(这会将您之前放入的新产品添加到其集合中)
    • SaveChanges()

    InsertProduct 应该

    • 如上所述检查/更新库存
    • Product 添加到 NoteProduct 集合中
    • SaveChanges()

    换句话说,这两种方法都将仅重用规则检查部分。 InsertProduct 最好重命名为 UpdateProductsOfNote,因为听起来 Note 是您模型的 aggregate 根(在 DDD 中,您可以针对聚合的持久性/存储库操作)。

    至于这些方法的位置,如果它们不是太复杂,将它们添加到存储库/数据访问类(拥有 EF 上下文对象)就可以了。看起来他们确实有很多与之相关的规则。如果是这样,某种域服务可能是更好的选择。似乎很多规则不仅仅是为了支持持久性。如果您重新定位这些方法,那么您可能不需要按照您在引用的帖子中的要求处理 ObjectContext 事件。

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2018-01-30
      • 2018-03-20
      • 2013-06-07
      • 2012-05-04
      • 2015-08-31
      • 2017-03-29
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多