存储库模式和聚合根模式和实体框架

时间:2013-02-10 16:06:27

标签: .net entity-framework repository-pattern aggregateroot

我正在将我的应用程序构建在存储库模式,聚合根和工作单元的行上。我使用Entity Framework5作为ORM。

我处于这样一种情况:我不知道如何继续添加新的实体,这些实体是聚合根,并且与非聚合根的实体具有外键关系。

我不确定我之前的陈述是否合理,但让我在这里举一个例子。

Db中的人员表(这是我申请中的聚合根)

  1. 名称
  2. 地址第1行
  3. CountryID
  4. 国家/地区表(这不是聚合根,因为我可能永远不需要独立查询它们)

    1. CountryID
    2. 国家/地区名称
    3. 在我的应用程序中,我有PersonsRepository,它实现了一个通用的Repository,其中T是一个聚合根。

      现在,当我在代码中创建一个新人时,我需要将Country添加到Person对象的Navigation属性中。如果我创建一个新的国家对象并将其分配给Person的Country属性并尝试保存Person对象,则EF抛出错误。我无法查询Countries表,因为它不是我的Aggregate root。

      嗯,这不是我的实际情况,但这正是我想要克服的。我该怎么从这里开始?

      我想到的一个想法是创建一个通用的只读存储库,用于查询数据库而不是修改它,这是一个好的方法,或者我正在做错事。

      提前感谢您的回复和阅读长篇文章。

1 个答案:

答案 0 :(得分:5)

聚合根不仅仅是您可能不需要直接查询的内容。根据您的推理,您必须多次创建同一个国家/地区,因为您无法查询该国家是否退出(即该国家/地区是一个需要人员存在的弱表)。

简单地说,agreggate根是可以在没有其他任何东西的情况下识别的对象。没有人可能存在国家,而没有订单则无法识别订单行。您可能希望阅读这篇文章:http://dddcommunity.org/library/vernon_2011

对于实体框架,请检查我的repository / uow:http://blog.gauffin.org/2013/01/repository-pattern-done-right/

的实现