2013-02-10 100 views
3

我正在构建我的应用程序,其中包括存储库模式,聚合根和工作单元。我正在使用Entity Framework5作为ORM。存储库模式和聚合根模式以及实体框架

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

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

人表在DB(这是一个总的根在我的应用程序)

  1. 名称
  2. 地址行1
  3. CountryID

国表(这不是因为我可能永远不需要独立查询它们)

  1. CountryID
  2. 国家名称

在我的应用我有PersonsRepository它实现了一个通用的存储库,其中T是一个聚合根。

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

嗯,这不是我的实际情况,但这是我想要克服的。我应该如何从这里出发?

我想到的一个想法是创建一个通用的只读存储库,它将用于查询数据库而不是修改数据库,是继续执行还是出现错误。

在此先感谢您的回复和阅读长篇文章。

+0

什么错误EF抛出? – 2013-02-10 20:24:36

+0

它引发“无法投人Person对象键入国家”,我认为这是完全有效的,为什么我应该创建一个新的国家对象时,它是一个外键在DB中。它工作得很好如果我使用datacontext获取Country,并在创建它时将其分配给Person对象。 – 2013-02-10 23:45:47

回答

5

聚合根不仅仅是你可能不需要直接查询的东西。根据你的推理,你将不得不多次创建同一个国家,因为你无法查询该国是否退出(即该国是一个需要Person存在的薄弱国家)。

简单地说,agreggate根就是可以被识别而没有其他任何东西的对象。一个国家可能没有一个人而存在,而一个命令行在没有命令的情况下不能被识别。你可能想看看这篇文章:http://dddcommunity.org/library/vernon_2011

至于实体框架,请查看我实现库/ UOW的:http://blog.gauffin.org/2013/01/repository-pattern-done-right/

+0

感谢您的回复jgauffin,这清除了我对聚合体的理解。 – 2013-02-12 14:08:25

+1

存储库文章:*'一个更现实的方法是,您在UserRepository.GetUsersGroupOnSomeComplexQuery()中直接使用ADO.NET,而您在UserRepository.Create()中使用实体框架。'*为什么我没有考虑过,欢呼! – 2017-05-05 07:19:39