我目前正在参与一个项目,我们开始使用DDD方法构建应用程序。 现在,我们正在考虑使用Entity Framework 6的Code First来帮助我们进行数据持久化。我的问题是如何最好地处理我们的领域对象和EF实体之间的数据映射?
我目前正在参与一个项目,我们开始使用DDD方法构建应用程序。 现在,我们正在考虑使用Entity Framework 6的Code First来帮助我们进行数据持久化。我的问题是如何最好地处理我们的领域对象和EF实体之间的数据映射?
这取决于你以何种方式实现它,找到适合自己风格并易于维护的方式,但是永远不要设计或修改您的域对象以使其更兼容或匹配ORM实体。这不是关于更改数据库或ORM,而是确保域(和应用程序的其余部分)与持久性详细信息(ORM是其中之一)正确解耦。
因此,抵制重用其他层次实现细节的诱惑。应用程序结构为层次结构的原因是您希望解耦。请保持这种状态。
为什么你不直接使用EF实体作为领域对象呢?既然你正在考虑使用Entity Framework 6 code first,那么你应该首先设计领域模型,然后再设计数据库结构。
我一直在使用NHibernate,并相信在EF中你也可以指定从数据库表到POCO对象的映射规则,特别是在EF6中。开发另一个抽象层来覆盖EF实体需要额外的工作量。让ORM负责这个任务吧。
我不同意你可能读到的那篇文章"Entity Framework 5 with AutoMapper and Repository Pattern",以及还有很多其他人只是将EF实体简单地用作领域对象。
AutoMapper肯定会在您开始构建表示层并面对大量UI特定视图模型时帮助您。它在构建贫血模型方面非常有用,但是在没有公共setter的真实域对象中有点无用。
Jimmy Bogard有一篇关于AutoMapper的旧文章"The case for two-way mapping in AutoMapper",他在其中说道:"我们从不需要双向映射,因此不存在双向映射。"
哦,我不会额外增加那个层。
NHibernate和Entity Framework Code-First(我会用EF)的设计目的就是解决这个确切的问题 - 将您的领域对象映射到关系模型(其设计上没有相同的约束,因此可能,而且很可能,具有不同的形状)。
看起来很可惜浪费了EF的出色映射能力,用其他东西替换它,即使是AutoMapper。