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


     

     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

  • 相关阅读:
    自动映射失效的解决办法
    D方法 自动完成
    怎样处理包含的动态模板
    后台登陆功能的实现 SESSION
    输入框 最简单的样式
    php 添加数据库的几种方法
    php 连接数据库
    array、isset、三元运算符、find()
    foreach、count、explode(对无限级分类的语法注释-显示无限级效果)
    两种常用的启动和关闭MySQL服务
  • 原文地址:https://www.cnblogs.com/mbailing/p/2593368.html
Copyright © 2020-2023  润新知