初探.NET 4.0中的Entity Framework(二)
上个月试装了Visual Studio 2010 BETA1版本,内置.NET 4.0。Entity Framework(EF)是其中的一个非常重要的框架,在上文中我也介绍过,从整体上看,Entity Framework已经开始让.NET逐步走向了领域驱动设计时代。
事实上Visual Studio 2008 Service Pack 1中已经带了一个Entity Framework的BETA版本,但遗憾的是,这个版本的Entity Framework与领域驱动设计思想仍然相去较远,更贴近于原来的LINQ to SQL,理由是,它不支持值对象。
Visual Studio 2010 BETA1中的Entity Framework版中引入了ComplexType,这就是对值对象的很好支持。ComplexType由一个和/或多个ScalarType/ComplexType组成,在做关系型数据库映射时,会被映射到数据表的多个字段,这个特性与NHibernate中的component相似。
从目前的情形看,我仍然觉得Visual Studio 2010 BETA1中的Entity Framework有以下需要考虑或者改进的地方:
- 对枚举类型的支持。当前的版本不支持枚举类型,其实枚举是领域模型中很重要的数据类型。比如:销售订单的状态(OrderStatus)可以有:新建、已提货、已装箱、已发货、已出发票、已退货等,那么在做建模的时候,使用包括有Created, Picked, Packed, Shipped, Invoiced, Rejected等成员的枚举,会使得模型通俗易懂;然而,目前的EF不支持枚举,设计人员不得不暂时使用int等基本数据类型来取代
- 对“模型”概念的定义。目前的EF允许用户在Entity Data Model Designer上设计模型,并能保存成edmx文件。然而在这个设计器上所看到的“模型”跟实际的领域模型还是有差距的,比如对模型对象操作的定义,目前还是无法体现在设计器上,设计器上的模型主要还是一种对象化的数据库体现形式,也就是跟数据库关系比较密切。领域驱动设计中很重要的一条就是,属于领域对象的操作,应该尽量放在类的定义中,而不仅仅是POCO/POJO。那么现在,开发人员只能通过部分类partial class的特性来实现这样的功能。理由很简单:模型类都是由Visual Studio自动生成的
- 仍然是上文中我的观点:模型的更改很难自动地映射到持久化机制上。详情请见这篇文章
从总体上,我对EF的感受基本上就是这些,今后,我会从领域驱动设计的角度来进一步探讨Entity Framework对DDD的支持,相信到时候会有更多的收获。