Entity Framework学习笔记(一)
请注明转载地址:http://www.cnblogs.com/arhat
哈哈!老魏回来了,4月份的内容开始更新了,由于3月份时间都在做项目,没有时间写了,那么4月份老魏会尽可能的多写点东西的。那么4月份的内容主要是EF和Linq了。至于NHibernate没有更新完,后面有时间的话老魏会更新的。
一、EF简介
EF的全称是Entity Framework,是微软推出的一款ORM框架,和Nhibernate的作用是一样的,但是出自微软之手那么肯定在兼容性上要非常的到家。虽然EF是个迟来的产品,但是他的特性非常的好,比起NHibernate简直是简化太多了,比如我们不用在写那些映射文件了。好了,废话一堆了,开始介绍一下怎么使用EF吧。
至于EF的知识,老魏在后面将会补上,因为老魏不是很新欢edmx文件把映射文件,实体文件都放在一起,这样不利于分层的设计的。
今天主要把老魏分离EF的心得写出来,否则后面就要忘了!(汗,人老了!)
二、EF分离环境的搭建
这里呢,老魏使用的是MySql数据库,至于为什么不用SQL Server呢,主要是老魏的本本伤不起啊!所以老魏在学习EF的时候走了很多弯路啊!
首先我们建立一个”Com.ArHat.EF”的解决方案,同时在解决方案中建立4个项目:
1,Com.ArHat.DAL(类库)
2,Com.ArHat.BLL(类库)
3,Com.ArHat.Model(类库)
4,Com.ArHat.Test(控制台应用程序)
并添加他们之间的相互引用(小孩子都会了)。

然后,我们需要在Com.ArHat.Model添加一个edmx文件,也就是“ADO.NET 实体数据模型”。




当我们添加完毕edmx文件后,更改一下edmx的属性,把“代码生成策略”改为”无”。因为我们要使用T4模板来分离edmx生成的文件,利于我们的分层,所以这里非常的重要。

然后我们在edmx的设计界面右键点击,选择“添加代码生成项”。



然后选择“POCO Generator With Validations”这个微软提供的T4模板。最后在Model项目中生成了2个T4文件和对应的.cs文件
但是此时,我们会发生成的代码是有问题的,因为在Model项目中并没有引用“System.ComponentModel.DataAnnotations”的dll文件,所以加入这个文件,同时把生成的实体类中的 [MaxLength(50)]这个Attribute去掉,否则是错误的哦。
接下的步骤就是复制粘贴了,我们把生成的School.Context.tt文件复制到DAL项目中,当然肯定要更改命名空间了!
当我们把School.Context.tt复制到DAL项目中的时候,回发现School.Context.cs文件变成一个空文件了,不要担心,因为School.Context.tt找不到edmx文件了,此时我们打开这个文件并更改edmx的路径。如下所示:
string inputFile = @"..\\Com.ArHat.Model\\School.edmx";
然后我们保存tt文件,会发现此时的School.Context.cs文件又有内容了。但是编译的时候确实错的。

原因是我们在DAL中没有引用System.Data.Entity.dll文件。添加一下引用就可以了。此时就基本上大功告成了,我们在BLL中写一个类用来测试一下我们的劳动成功吧!
首先还要在BLL项目中添加”System.Data.Entity.dll”的引用。建立一个B_Student.cs文件,内容如下:
public class B_Studnet
{
private DAL.SchoolEntities context = new DAL.SchoolEntities();
public List<Model.student> GetAllStudent()
{
var query = from stu in context.student
orderby stu.sid
select stu;
return query.ToList<Model.student>();
}
}
然后我们在Com.ArHat.Test主项目中测试一下,代码如下:
class Program
{ static void Main(string[] args) { BLL.B_Studnet studentBLL = new BLL.B_Studnet(); foreach (Model.student stu in studentBLL.GetAllStudent())
{ Console.WriteLine(stu.sname); } } }
运行一下看看效果:

哦,不。怎么可能报错呢.这是为什么呢?其实问题就出在程序运行的时候是查找的主项目中的App.config文件,而我们的链接字符串是在Model项目中生成的,所以在程序运行的时候,是无法找到的,解决方法就是把Model中的App.config文件复制到主项目中就可以了。然后我们在来测试一下。
激动人心的时候终于到来了,成功了,我们成功了!呵呵。其实这也没什么的。通过上面的步骤,我们知道如何把edmx文件分成两个部分了,一个是实体类,一个是DbContext了。这样就达到了我们分层的目的了。
好了,今天就到这里吧!
Entity Framework学习笔记(一)的更多相关文章
- Entity Framework 学习笔记(2)
上期回顾:Entity Framework 学习笔记(1) Entity Framework最主要的东西,就是自己创建的.继承于DbContext的类: /// <summary> /// ...
- Entity Framework学习笔记
原文地址:http://www.cnblogs.com/frankofgdc/p/3600090.html Entity Framework学习笔记——错误汇总 之前的小项目做完了,到了总结经验和 ...
- ADO.NET Entity Framework学习笔记(3)ObjectContext
ADO.NET Entity Framework学习笔记(3)ObjectContext对象[转] 说明 ObjectContext提供了管理数据的功能 Context操作数据 AddObject ...
- Entity Framework学习笔记——错误汇总
之前的小项目做完了,到了总结经验和更新学习笔记的时间了.开始正题之前先啰嗦一下,对之前的学习目标进行一个调整:“根据代码生成表”与“生成数据库脚本和变更脚本”合并为“Code First模式日常使用篇 ...
- Entity Framework学习笔记——记一个错误解决方式及思路
继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...
- Entity Framework学习笔记——配置EF
初次使用Entity Framework(以下简称EF),为了避免很快忘记,决定开日志记录学习过程和遇到的问题.因为项目比较小,只会用到EF的一些基本功能,因此先在此处制定一个学习目标:1. 配置EF ...
- Entity Framework学习笔记(四)----Linq查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...
- Entity Framework学习笔记(三)----CRUD(2)
请注明转载地址:http://www.cnblogs.com/arhat 昨天晚上老魏配的机器终于到了,可是拿回来之后什么都组装好了,唯独差一个非常重要的组件"电源线",老魏那个汗 ...
- Entity Framework学习笔记(二)----CRUD(1)
请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...
随机推荐
- 关于BitmapFactory解析流的问题a
今天碰到了一个超级恶心的问题,BitmapFactory.decodeStream(bis,null,options)一直是返回NULL 问题是这样子的: InputStream is= respon ...
- [Nginx 2] form表单提交,图片上传
导读:昨晚恶补了一些Nginx服务器的东西,从整体上对Nginx有一个初步的了解.上午去找师哥问了问目前项目中的使用情况,然后就开始上传图片了.这里就简单总结整理一下今天的成果,以后接着提升.简单粗暴 ...
- cordova android ios
一 . cordova android 中js 调用JAVA 方法: 二 . cordova ios --->js 调用object (一); 三 .cordova ios --->OC ...
- Leetcode001 two sum
/* c++ STL is much nore than what i think before in these aspects: * initializer for node element in ...
- 复杂的sql 一对多查询
SELECT distinct u.Name as UserName, a.OrderId, ( select d.SignCity from T_O ...
- setjmp 与 longjmp
setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义 ...
- How to search compound files
Last week my friend told me that she made a terrible mistake. She conducted raw serch and found no s ...
- leetcode 24
链表操作的,要注意标记头结点和边界问题. 代码如下: ListNode *swapPairs(ListNode *head) { if(head==NULL||head->next==NULL) ...
- C#winform设置DateTimePicker的时间格式
在对DateTimePicker进行时间格式设置时候,要先对属性Format设置为"Custom"自定义格式,然后再CustomFormat里面进行格式设置 比如"yyy ...
- pjax 历史管理 jQuery.History.js
更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...