近一年的时间没怎么更新了,全部的精力和心思都扑在了创业项目上,也许忙不应该是不写博客的理由,但真实的生活过得就是如此匆忙,无奈……
言归正传,最近一直在用SubSonic ,一个很小巧的O/R Mapping工具,当然,只是用它做些比较简单的查询,复杂的查询对它来说太过于困难,你得为它设置外键关联,写映射类,如果想要实现双表的JOIN,还涉及到分页查询,那真是愁煞人也,不信你可以看看StackFlow上有多少洋人兄弟被它难倒!!
SubSonic的问题,在于它的对象过重,捆绑了对数据关系的描述,好处是一些方法的方便程度高,缺点是丧失了灵性性,某些场景只能仰天长叹无能为力!就这方面而言,与nHibernate相差甚远,简直不可称为O/R Mapping。
由于项目的特性,在数据层选型上使用了Entity Framework 4(以下简称EF4),而不是我熟悉的nHibernate(一个有意思的现象是,很多人把自身对不熟悉技术的恐惧,转义为这门技术还不成熟)。
这倒无妨,随着项目的演进和对EF4的熟悉深入,我倒是喜欢上了这个框架。EF4是伴随着.NET Framework 4和Vs2010一起发布的,且认为这是微软在数据访问层级的拳头产品吧,在很多关键部位,平台和IDE对EF4做出了强有力的支撑,比如T4模板引擎和与之配套的T4 Editor,LINQ TO Entities提供的查询灵活度,简单可控的对象模型POCO(Plain Old CLR Object)。
好的ORM都是相似的,数据对象可以定制,贫血模型,比如nH,比如EF4。数据对象是否为POCO真的有那么重要吗?是的,更进一步说,其实是对象是否可以定制,比如SubSonic,生成的对象,居然是不可序列化的,用它做一个稍微有点复杂的Web页面,你都会付出更多的劳动……
EF4会为每一个数据库连接生成一个数据容器,和一个数据关系映射XML文件(.edmx)。
数据容器继承自System.Data.Objects.ObjectContext,它拥有对连接和数据集(数据集ObjectSet对应数据库中的表)的描述,并以此为我们提供CRUD访问功能。
数据关系映射文件.edmx的结构设计颇为讲究,分为SSDL(存储模型简单直接介质层)、CSDL(概念模型简单直接介质层)、C-S mapping(存储-概念映射关系 )三大块:SSDL是对于容器中数据集以及数据表映射关系的描述,CSDL则是数据表映射与POCO关系映射的描述,C-S mapping将上述二者对应起来。
日常对数据源的维护更新表通过对.edmx的操作进行,在.edmx里的结构发生变化后,运行T4模板,重新生成数据容器和与之关联的Poco对象群。而EF4这个T4模板,像nHibernate和iBatis.net下的模板一样,有自己的语法和解析器,可以对生成的Poco对象进行定制。
下一回合,将通过一个使用Ado.net Entity Data Model和Ado.net EntityObject Generator生成EF4 Poco的实例,来进一步了解EF4的特性。