Entity framework 4 使用EF4和存储库模式的对象查询模式

Entity framework 4 使用EF4和存储库模式的对象查询模式,entity-framework-4,repository-pattern,objectquery,Entity Framework 4,Repository Pattern,Objectquery,关于存储库模式和查询对象模式的问题。我使用EF4,并在VS2010中使用ADO.NET POCO实体生成器从数据库模型生成了POCO类。edmx文件和tt文件(POCO类)位于两个不同的项目中 我的存储库是特定于域的,例如DocumentRepository和UserRepository。我的数据库模型与我的域模型的不同之处在于,我实现了映射器,以便将域对象转换为一个或多个数据库表(反之亦然)。一个例子是,我的文档域类被建模为数据库中的3个表(因此也是POCO类) 在这种情况下使用域对象时,您将

关于存储库模式和查询对象模式的问题。我使用EF4,并在VS2010中使用ADO.NET POCO实体生成器从数据库模型生成了POCO类。edmx文件和tt文件(POCO类)位于两个不同的项目中

我的存储库是特定于域的,例如DocumentRepository和UserRepository。我的数据库模型与我的域模型的不同之处在于,我实现了映射器,以便将域对象转换为一个或多个数据库表(反之亦然)。一个例子是,我的文档域类被建模为数据库中的3个表(因此也是POCO类)


在这种情况下使用域对象时,您将如何实现查询对象模式?在我看来,我必须基于POCO类而不是域类来编写查询对象?但这不会打破存储库模式吗

ORM通常以直接处理域对象的方式使用=它从数据库加载域对象并将其持久化到数据库。您正在执行另一个抽象步骤,即仅使用ORM实体填充自定义对象。您的自定义对象完全超出了您的ORM工具的范围,您不能期望ORM工具会为您的域对象之上构建的查询提供任何支持。您必须构建自己的查询支持,并在存储库中将域查询转换为ORM查询。这通常是通过实现规范模式来实现的


顺便说一句,在这种情况下,POCOs没有太大意义-POCOs适用于您希望将其用作域对象的情况。

ORM通常以直接处理域对象的方式使用=它从数据库加载域对象,并将其持久化到数据库。您正在执行另一个抽象步骤,即仅使用ORM实体填充自定义对象。您的自定义对象完全超出了您的ORM工具的范围,您不能期望ORM工具会为您的域对象之上构建的查询提供任何支持。您必须构建自己的查询支持,并在存储库中将域查询转换为ORM查询。这通常是通过实现规范模式来实现的


顺便说一句,在这种情况下,POCO没有太大意义-POCO适用于您希望将其用作域对象的情况。

entity framework 4.1允许您将一个实体拆分为多个表。这样就不会破坏回购模式。entity-framework 4.1允许您将一个实体拆分为多个表。这样就不会破坏repo模式。我意识到,我实现存储库模式的努力创建了一个有点复杂的设计,因为我不想在表示层和业务层中使用我的POCO类。我觉得他们没有按他们应该的方式对我的域进行建模,这就是为什么我开始使用域类。我不明白为什么规范模式是这里的方式,但是我以前没有使用过它。规范将允许您在域模型上以您需要的方式定义查询,并将其转换为存储库中EF所需的EF查询。因此,我还需要编写从域查询到EF查询的转换逻辑。。我不确定我是否有时间做所有这些,这让事情变得复杂。如果我在规范中使用POCO类并对它们编写查询,我会破坏层边界,对吗?毕竟,我的目标是通过使用域对象隐藏数据模型。也许我应该重新考虑在这个项目中使用存储库模式,但这就是您创建设计的方式。是否要使用自定义对象进行自定义查询?如果答案是肯定的,那么您必须构建“查询描述”=将传递到存储库的规范模式(=以下模式表示用户以声明方式指定查询),存储库必须处理所有复杂性。如果您不喜欢它,因为它很复杂,那么可以从存储库中公开POCO,而不是自定义域对象,并直接使用linq访问实体。在UI中,您可以使用自定义视图模型或从POCOs加载的其他面向表示的类。嗯,我希望在我的域对象上进行查询,以使我的设计更加灵活,但我现在开始后悔:)也许我应该在我的存储库上编写具体的方法,这些方法完全符合我的要求,而不是更通用的方法。它将使事情保持简单(但会使存储库膨胀)。我想这里有一个教训要吸取!:-)谢谢你回答我的问题,拉迪斯拉夫!继续做好stackoverflow的工作!我意识到,由于我不想在表示层和业务层中使用我的POCO类,因此我实现存储库模式的努力创建了一个有点复杂的设计。我觉得他们没有按他们应该的方式对我的域进行建模,这就是为什么我开始使用域类。我不明白为什么规范模式是这里的方式,但是我以前没有使用过它。规范将允许您在域模型上以您需要的方式定义查询,并将其转换为存储库中EF所需的EF查询。因此,我还需要编写从域查询到EF查询的转换逻辑。。我不确定我是否有时间做所有这些,这让事情变得复杂。如果我在规范中使用POCO类并对它们编写查询,我会破坏层边界,对吗?毕竟,我的目标是通过使用域对象隐藏数据模型。也许我应该重新考虑在这个项目中使用存储库模式,但这就是您创建设计的方式。是否要使用自定义对象进行自定义查询?如果答案是肯定的,那么您必须构建“查询描述”=将传递到存储库的规范模式(=以下模式表示用户以声明方式指定查询),存储库必须处理所有复杂性。如果你不