实体框架和预先加载以及使用 DDD 方法的企业应用程序

Posted

技术标签:

【中文标题】实体框架和预先加载以及使用 DDD 方法的企业应用程序【英文标题】:Entity Framework and eager loading and enterprise application with DDD aproach 【发布时间】:2013-11-27 19:50:59 【问题描述】:

我们正在尝试使用实体框架 (EF) 和域驱动设计 (DDD) 样式模式方法创建一个 ASP.NET MVC 4 应用程序。正如您在我们的领域层部分看到的,我们有一个复杂的设计。我们需要使用惰性和急切的方法加载实体。不幸的是,我们在 Entity Framework 中的这些方法存在很大问题。

据我们了解,对于实体框架中的预加载,我们必须使用 Include 方法并给出属性字符串和属性等。(在 Hibernate 和 Java 中,我们可以使用成员的注释顶部来加载热切地,它比这种方法容易得多)。

但可怕的问题是我们有继承结构和严重的多态性。在这些状态下,我们没有应该包含的字符串,因为我们不知道选择了一个类的哪个派生类来理解应该包含哪些属性。

例如,如您所见,结果有一个项目集合,然后决定向该集合添加一些组,每个组都有一些组和字段(如组合模式)。现在假设我们想要加载一个类似于上面讨论的结果。当我想写一个给定包含的字符串时,我不知道这个结果的哪些项目是组。因为我们无法预测这些项目是组,所以这些组有一个应该加载的项目集合。

this.Items = new List<Item>
            
                new Group(
                    a,
                    new List<Item>
                    
                        new Field(b),
                        new Field(c),
                        new Field(d),

最后我们有一个关键问题:实体框架是为具有复杂域和 DDD 方法的企业应用程序设计的吗?如果没有,我们如何在 C# 软件工程和企业应用中效仿 Martin Fowler 和 Eric Evans 的方法?

【问题讨论】:

【参考方案1】:

实体框架是为具有复杂域和 DDD 方法的企业应用程序设计的吗?

是的。

一个真实的领域模型在形状上可能与相应的数据模型不同,原因有很多。像 EF 或 NHibernate 这样的“企业”ORM 的目标是在两者之间进行转换,甚至支持多个数据库。

我没有真正看到的是您的域模型。您的图表看起来像一个数据模型,它是一个实现细节。我希望看到医生、患者、问卷、预约、治疗、处方等。您可以选择以您描述的方式存储这些(例如,Stack Overflow 将问题和答案都存储为“帖子”),但这就是映射是为了,老实说,如果您使用的是关系数据库,那么最好使用类似于域模型的表。如果您想要一个完全灵活的存储,那么 RDBMS 可能不是正确的工具 - 或许可以考虑使用文档数据库?

【讨论】:

以上是关于实体框架和预先加载以及使用 DDD 方法的企业应用程序的主要内容,如果未能解决你的问题,请参考以下文章

实体框架4:使用自我跟踪实体的过滤器进行预先加载(包括)

EF6基础系列(九)---预先加载延迟加载显示加载

实体框架 - 相关实体性能

不禁将域实体视为浪费。为啥?

DDD领域模型企业级系统

EF 延迟加载和预先加载