atc*_*way 7 domain-driven-design entity-framework poco
我有一个域模型体系结构,其中我的域/业务对象是基于问题域创建的,并且独立于物理数据模型或持久性结构的任何知识.到目前为止,我已经走上正轨,因为它完全可以接受,并且通常情况是域模型和数据模型之间存在阻抗不匹配.一个DBA创建的数据库获取数据,他们需要的,但它并不封装应用的整个域模型或设计.
结果 - 我有自己的一组域模型对象.但是,所有需要持久存储的字段确实存在于我的域模型中的某个位置,但不一定是我自动生成的.edmx POCO实体拥有它们的形状.所以我拥有所有数据,它与完全形状完全不同,就像创建自动生成的POCO实体的表一样.
我已经看过关于这个主题的一些帖子,比如将POCO实体转换为业务实体,使用现有域模型将实体框架4 转换为如下所示的语句:
"使用与域类相同的名称在实体数据模型中创建实体.实体属性也应具有与域类中相同的名称和类型"
什么!?没办法,为什么我必须让我的域模型重新变形为完全建模在数据库中的数据模型/表结构之后的POCO ?例如 - 在我有5个给定属性的情况下,2可能在类'A'中,3在类'B'中,而自动生成的POCO类在其自己的类'A'中具有全部5.
这就是整点,我想要分离我的对象模型和数据模型,但仍然使用像EF 5.0这样的ORM来映射它们.我不想在数据模型中创建和形成这样命名的类和属性.
现在我在EF 5.0的.edmx正在生成POCO类的我,但我的问题是,如何化解这些并重新连接一切,我的包含所有数据域对象只是在不同的形状?
顺便提一下,使用Code First方法提出的任何解决方案都不是一种选择,所以请不要提供.我需要一些使用EF5的指导或教程(最好)(如果可能,因为EF4示例总是从ObjectContext继承POCO),并将我自己的业务对象连接到.edmx.
任何帮助或指导表示赞赏,谢谢!
这听起来正是实体框架的用例。我在这里做一些假设。首先,当您做出此声明时:
“我有一个域模型架构,其中我的域/业务对象是基于问题域创建的,并且独立于物理数据模型或持久性结构的任何知识。”
您的意思是该域是在 EF 设计器中创建的?但你接着说:
“然而,所有需要持久化的字段确实存在于我的域模型中的某个地方或另一个地方,但不一定是我自动生成的 .edmx POCO 实体所具有的形状。”
在我看来,我的第一个假设是不正确的。
接下来,你先解雇代码吗?如果您的领域模型/业务对象是基于代码的,并且您希望将它们保存到关系数据库中,那么这正是代码优先的用例。您已经有了代码,现在需要创建 DbContext 并将其映射到物理模型。
然而你驳回了这一点......所以有一些想法:
如果您有一个基于代码的业务对象的域模型,并且您有一个用于其他用途的 EDMX,我认为您需要创建一个存储库层,该存储库层使用自动映射器或手动投影之类的东西来查询您的实体并返回您的业务对象。
如果您有一个基于代码的业务对象的域模型,并且您有一个 EDMX,除了保留业务对象之外,它不用于其他用途,我想说您需要在 EDMX 中表达您的域,然后将其映射到现有数据库。这确实是 ORM 的用例。拥有两个域模型并从一个模型映射到另一个模型(其中一个模型与您的域匹配,一个模型与您的数据库匹配)会添加额外的不需要的管道层。
上面的后一种方法在 EF 术语中称为“模型优先”。有几篇关于它的文章,尽管其中大部分只是从模型生成数据库。您不会执行该步骤,而是会将实体映射到现有数据库上。
其基本步骤是“从数据库更新”,而不选择任何数据库对象(或将创建实体)。或者,您可以在设计器中使用现有的 .edmx(听起来就像您拥有的那样)并修改实体以匹配您的业务域。或者只是删除 EDMX 模型中的所有实体,根据需要创建实体,然后将它们全部映射。
这是我制作的一个 jing,我使用 EF 设计器引入模型存储(执行此操作的唯一方法是允许它生成实体),然后在询问时单击“否”来删除允许存储信息保留的实体如果你想删除表信息。
http://screencast.com/t/8eiPg2kcp
我没有添加 POCO 生成器,但如果添加了,它会在设计器中将实体生成为 POCO 类。