.net 存储库模式和聚合根模式以及实体框架

.net 存储库模式和聚合根模式以及实体框架,.net,entity-framework,repository-pattern,aggregateroot,.net,Entity Framework,Repository Pattern,Aggregateroot,我正在根据存储库模式、聚合根和工作单元来构建我的应用程序。我使用实体框架5作为ORM 我所处的情况是,我不知道如何继续添加新实体,这些实体是聚合根,并且与非聚合根的实体具有外键关系 我不确定我之前的陈述是否有意义,但让我在这里举个例子 数据库中的Person表(这是我的应用程序中的聚合根) 名字 地址行1 乡下人 Countries表(这不是聚合根,因为我可能永远不需要单独查询它们) 乡下人 国名 在我的应用程序中,PersonsRepository实现了一个通用存储库,其中T是聚合根 现在,当

我正在根据存储库模式、聚合根和工作单元来构建我的应用程序。我使用实体框架5作为ORM

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

我不确定我之前的陈述是否有意义,但让我在这里举个例子

数据库中的Person表(这是我的应用程序中的聚合根)

  • 名字
  • 地址行1
  • 乡下人
  • Countries表(这不是聚合根,因为我可能永远不需要单独查询它们)

  • 乡下人
  • 国名
  • 在我的应用程序中,PersonsRepository实现了一个通用存储库,其中T是聚合根

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

    好吧,这不是我的实际情况,但这是我试图克服的。我应该如何从这里开始

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


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

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

    简单地说,agreegate根是可以识别的对象,不需要任何其他东西。一个国家可能在没有人的情况下存在,而没有订单则无法识别订单行。您可能想阅读本文:


    至于实体框架,请检查我的repository/uow:

    实现,EF抛出了什么错误?它抛出了“无法将Person对象转换为type Country”,我认为这是完全有效的,为什么我要在db中创建一个新的Country对象,而它是一个外键。如果我使用datacontext获取Country,并在创建它时将其分配给Person对象的Country属性,则效果非常好。感谢回复jgauffin,这澄清了我对聚合的理解。repository文章:“一种更现实的方法是您在UserRepository.GetUsersGroupOnSomeComplexQuery()中当您在USERealSo蓄中时,直接使用ADO.NET。CurATE()使用实体框架。“为什么我从来没有考虑过,干杯!