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