Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我应该使用EF实体对域对象进行水合物化吗?_.net_Entity Framework_Domain Driven Design - Fatal编程技术网

.net 我应该使用EF实体对域对象进行水合物化吗?

.net 我应该使用EF实体对域对象进行水合物化吗?,.net,entity-framework,domain-driven-design,.net,Entity Framework,Domain Driven Design,关于这一点有很多问题,但据我所知,没有一个能解决这个问题 域对象使用EF实体对其进行水合物化是错误的吗?一方面,这与纪念品非常相似。EF实体可以被视为DTO或活动记录 另一方面,这似乎将域耦合到DAL(因为EF实体可以被视为DAO) 编辑以澄清我在这里的问题。。。我有一个域模型,它不知道我的数据访问层。存储库返回我的DO,但这些DO是使用DTO组合在一起的。DTO是专门为存储库构建的属性包,用于补充DOs。因此,尽管我的DO不依赖于EF实体,但它们依赖于DTO,DTO的唯一任务是从EF实体映射。

关于这一点有很多问题,但据我所知,没有一个能解决这个问题

域对象使用EF实体对其进行水合物化是错误的吗?一方面,这与纪念品非常相似。EF实体可以被视为DTO或活动记录

另一方面,这似乎将域耦合到DAL(因为EF实体可以被视为DAO)

编辑以澄清我在这里的问题。。。我有一个域模型,它不知道我的数据访问层。存储库返回我的DO,但这些DO是使用DTO组合在一起的。DTO是专门为存储库构建的属性包,用于补充DOs。因此,尽管我的DO不依赖于EF实体,但它们依赖于DTO,DTO的唯一任务是从EF实体映射。。。所以我创建的代码完全是为了方便用户。我觉得这有点臭


我绝对不是在问DO是否应该使用EF来坚持自己。我在问我是否可以从EF实体中读取数据,以使DO生效。

不要将EF实体持久化到数据服务层

部分原因是名字冲突。但是,即使您从未打算将产品放在非EF平台上,您也应该从实际对象及其方法中抽象出其持久化方式(EF结构)的细节

我曾在.NET世界的几个项目上有过亲身经历,这些项目一直使用EF生成的对象,直到ASP.NET层,而且从来没有好的结局。当您这样做时,您引入了足够多的耦合,使您的应用程序实际上从n层到1层

这里有一个更好的方法-

使用您的方法(保存、获取等)创建IPersistenceService接口

为实体框架-EFPersistenceService创建一个实现

在您的每个方法中,将EF对象映射到您的实体模型-您可以使用automapper或其他技术来实现这一点

应用程序的其余部分应仅通过IPersistenceService(应用程序始终符合接口规则)与数据库通信


如果这看起来有点过分——问问自己,将来如何通过拆分数据库(CQRS)来提高性能,或者出于性能原因是否必须更改存储过程的特定更新

通常,从EF实体到域实体的转换将在持久性层中的存储库方法中完成。您的域实体对EF之类的东西一无所知。@Matthew为什么要这样做?如果将域与DAL耦合,有什么好处?@guillaume31没有好处。我的选择是什么?我创建了一个DTO,它是实体的深层副本,并使用它?@AdrianThompsonPhillips同意,实体是一个POCO。。。我想的问题是我应该使用什么?@Matthew使用EF-Code-First+fluent-API直接映射到域对象怎么样?此外,“水合物”意味着根据数据库中的数据填充对象,我从未见过它以另一种方式使用。你到底想做什么?这是真的,即使它没有回答OP的问题,因为我(正试图)理解它。顺便说一句,您基本上是在描述DDD中的存储库模式。是的,我理解。但是你的答案和我的问题之间的主要区别是你在使用自动映射器来生成DO。最终,这是一个糟糕的解决方案,因为这意味着DO不能水合,除非通过反射(例如automapper的工作原理)。。。在没有纪念品的情况下,只有知道映射器的层才能实例化DO。。。我的问题有意义吗?您不必使用automapper—将持久性抽象到接口中的全部目的是允许在不影响调用代码的情况下对其进行更改。顺便说一句,您可以将持久性代码保存在存储库中,但在我看来,将数据库调用抽象出来并使其成为存储库的依赖项更有意义。