Entity Framework 4.1/4.3 之三(由4.0过渡到4.1/4.3)

 

 Entity Framework 4.1/4.3  之三(由4.0过渡到4.1/4.3)

 

  大家好,前两个星期一直接在忙。在做新项目中我用了 Entity Framework 4.3,其实也是从4.0进行了一下过渡。要知道,一旦习惯了一种方式,要改变的话,真不是件容易的事。在左右脑博弈了尽一天后我才有勇气向Entity Framework4.3进行过渡。由于4.0中遇到的许多问题自己都有了解决方案,对于未知的4.3充满了向往但也伴随着抵触。在项目结束(小项目)后,我一直在思考着这篇文章应该怎么写,如何写。好了,寒暄之后快快随我进入本文的主题。

 

      来个小提示:本文说到的EF4.0是指伴随着 .net Framework 3.5 一起发布的那一版。因为我一直不知道那一版的版本号,所以我就叫她EF4.0了(这也是一种拟人话的叫法,因为称呼用了"她")。

    

      一、为什么要过渡

 

           (1)、EF4.0中对象太多:为什么这说呢?

 

                  相信用过EF4.0的同学们发会现,Edmx文件会暴露出一个类,这个类和数据库中的表同名,其实就是一个映射类。比如表名:"BJ_Student"。那么Edmx里就会暴露BJ_Student类,供我们进行数据增删改查的操作。

 

                  但是由于BJ_Student在edmx中与很多东西有映射(你可以把edmx文件的后缀名改成xml,然后再打开,里面会看到所有的映射关系),所以如果想增加一些扩展属性,着实不容易。所以在4.0中,我习惯建一个Student的对象,将从BJ_Student中读出来的数所放到自己新建的Student对象中去。

 

                  上个小例子(4.0),

                  

            var query = (from m in context.BJ_Student
                         where id=12
                         select  new student
                    {

                              name=m.name

                    }).FirstOrDefault();   

                   这是4.0中的一种写法。 这个返回的结果是 student

                   倘若我们在增加一些DTO类,哇,那这个类真是太多了。累啊!

                   但是在4.1/4.3中,同样是映射的BJ_Student,但是这个类我们可以进行扩展,可以增加扩展字段。

 

                    (4.1/4.3)    var query  = (from m in context.BJ_Student where id=12).FirstOrDefault();  这个返回的结果是BJ_Student。

                   可以看出,在(4.1/4.3)中,我们只需要使用BJ_Student一个类就可以了,因为她可以自由灵活的扩展。

                   类数量减少,无疑是一个非常有意义的事。  可能这段与 前一文中有些类似,这里全当是温故而知新了。

 

           (2)、对关系的灵活处理

                  (4.0)、

            var query = from s in test.BS_Roster
                        join c in test.BS_CLASS
                        on  s.rid = c.rid
                        select s ;

        4.0中这种关联查询真的是....只省略6个字,虽然写起来很方便,但总感觉还在写Sql,而且表一多起来,人都快疯了,嘴里不停的念着Fuck, Fuck....

                       可见4.0对表的关联查询不够灵活。

 

                  (4.1/4.3)、

            var query = from m in context.Dic_PropertyTypeDef.Include("Dic_PropertyClassDef")
                      where m.State == 0
                      select m);

                       4.1/4.3中是.Include("Dic_PropertyClassDef")。由于我们在Dic_PropertyTypeDef这个对象增加了一个这样的属性,如下

                       public virtual Dic_PropertyClassDef Dic_PropertyClassDef { get; set; } 可以看出来是virtual类型的,这是单个的对象属性.一眼就能看出

来Dic_PropertyTypeDef对Dic_PropertyClassDef 是一对一关系。当然,Dic_PropertyClassDef对Dic_PropertyTypeDef是一对多的关系。

                       一对多的话,属性对象应该定义如下:

                        public virtual ICollection<Dic_PropertyValueDef> Dic_PropertyValueDef { get; set; }  同样是virtual类型,不过是ICollection集合。

                        在4.1/4.3中,只要我们建立好了这个对应关系,关联查询就变的简单多了。是不是觉自得很不错。但是如果你用习惯了4.0,突然让你接受这种写法,感觉一定不爽,所以建议慢慢过渡,同时要学会控制发情绪。冲动是魔鬼啊。

 

              (3)、代码清晰,相应的代码量变少了。edmx文件也不见了。事实上他还是存在的。

 

              (4)、由于(4.1/4.3)在Sql语句的生成方面和性能方面做了很大的优化,所以速度上比4.0更快,更方便使用,更容易扩展。

 

              以上是我自己在开发中总结出来的一些优点,在用词方面不够严谨,可能讲不太通俗易懂,还请大家多多海涵。

 

    二、EF4.1/4.3

 

         即然是过渡吗,当然是向好的过渡,在讲完了4.1/4.3的一些优势后,我们开渡。船呢,此一前序只当是为了引出下文,为了更好更高效的使用EF4.1/4.3,需要好的工具,在渡河之前我们不妨来先介绍一下这些工具。

 

         (1)、NuGet插件,这个工具可以帮助我们找到微软提供后些稳定类库及一些用于ORM编程的模板,不过我用到一些类库,模板实在是不敢恭维,不是不好用,而是不会用。

 

         (2)、EF Power Tool,在EF4.0中,我们通过新建emdx来实现对象表的映射。而且4.1/4.3由于提供了级大的灵活性,表映射的操作及类定义都可以自己来操作。但是对于繁多表来说,要一个一个建立映射真是要吐血了。所以 EF Power Tool 工具给我们提供了非常好的帮助。

                  下载地址:http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/ 

                  使用说明:http://www.cnblogs.com/LingzhiSun/archive/2011/06/13/EFPowerTool_2.html 

                  有了这样便捷的工具后,类,映射、DbContext 都生成了。我们就可以直接写业务了。

 

           工具有的时候能帮我们事半功倍。

 

    三、EF4.1/4.3 的一些使用小技巧

 

          (1)、多表关联查询的写法:

      var query = (from m in context.Dic_PropertyClassDef.Include("Dic_PropertyTypeDef")
                             .Include("Dic_PropertyTypeDef.Dic_PropertyValueDef")
                             .Include("Dic_PropertyTypeDef.Dic_PropertyOptValueDef")

                 这是一个多表关联查询的写法。可以不停的InCude下去。不过太复杂的业务建议还是用 sql或者存储过程更好些。

 

          (2)、EF4.1/4.3中的in语句:

                var query = Entities.Where(p => ids.Contains(p.ID));
                  ids 是本句中是你传的id列,可以是数组,泛型(List<int>)

 

          (3)、EF中的分页

                 query.OrderByDescending(r => r.PropID).Skip(startRowIndex).Take(maximumRows).ToList();

                 startRowIndex是起始索引,maximumRows要查询的条数。比如startRowIndex=0,maximumRows=10 ,就是要从0开始查找10条记录。

                 EF的分布必需要与OrderByDescending一起使用。

 

          (4)、增、删、改还是与ef4.0一样,我的博客中有类似这样文章。可以一看 。

 

         好了,过渡就写到这里,全当是项目结束的一个小总结,我是百灵。文章中有什么不对地方还望大家不吝指教。哈哈,现在正处大暑时期,黑的一塌糊涂。

 

百灵注:本文版权由百灵和博客园共同所有,转载请注明出处。
助人等于自助!  mbailing@163.com

posted @ 2012-07-16 15:24  jerry-Tom  阅读(4127)  评论(25编辑  收藏  举报