Entity Framework 新手入门友好实例
起因
因为实习的原因,程序之中用到了较多的数据库操作逻辑。如果每一处数据库操作都手写的话,工作量较大且后期不易于维护,所以希望能通过 ORM 框架来解决这两个问题。
在昨天之前,对于 ORM 这个词汇,我也仅仅只是在上个学期的 Java EE 课上看企业老师“神速”地使用 Hibernate 做了建立数据库、插入数据的演示。
这两天花了很多时间了解 Entity Framework,终于在今晚成功地实现了“查插删改”,中间经过了很多的波折。例如:查找的很多资料提供的代码都是不完整的,同时他们的讲解也不够“新人(菜鸟)友好型”。所以我决定把一个简单的实例的具体步骤写出来,帮助像我这样的菜鸟快速将 EF(Entity Framework) 应用起来。
如果博文有不当之处,欢迎指出,谢谢~
简介
首先是两个概念
对象关系映射(英语:Object Relational Mapping,简称 ORM,或 O/RM,或 O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。简单来说,就是可以把一条数据库记录转换为程序中的一个对象,或者反向转换,当然实际上 ORM 可以做更多的事情。)
Entity Framework (又称ADO.NET Entity Framework) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。
使用 Entity Framework 在实际数据库相关代码开发中可以采取三种方式:
- DB First:先开发数据库,然后借助 Visual Studio 将数据库中的表结构(或视图)转换为程序中实体模型类。
- Code First:直接在程序中定义实体模型类,然后借助 Visual Studio 将其转换为数据库中的表。
- Model First:借助 Visual Studio 中的可视化设计工具,设计好数据模型(可以理解为E-R图),然后转换为数据库中的表。
本实例采用第三种方式,即 Model First。
实例演示
本实例使用的是 Visual Studio 2017(Community),通过一个 WinForm 程序访问 SQL Server 2016(Express) 数据库来演示。
本程序可以实现学生信息的自我维护,包括对用户名、密码、性别、班级、电话等资料的处理。学生可以填写信息注册账号,然后使用账号登录查看自己的信息,并对自己的信息进行修改。
演示:
数据实体
两个实体:
用户(用户名,密码)
个人资料(学号,姓名,性别,电话,地址,爱好)
具体步骤
新建一个名为 Sstudent 的 WinForm 程序项目
新建一个名为 Model 的类库项目(可选)
新增一个名为 Sstudent 的 ADO.NET Entity Data Model
3.1 在向导中选择空的实体设计器模型
3.2 然后就可以开始创建自己的实体模型
这里首先从工具栏拖出两个 Entity 。
此时我们观察一下属性区,这里有两项比较重要的属性,如下图
其中 Name 可以理解为对应将来的数据库表中的一条记录的名字,Entity Set Name 对应的则是一张表的名字。这里修改一下,即用户表(或用户集,UserSet)中会有多条用户记录(User)。
再来观察一下实体中的属性,在我们创建 Entity 的时候,会自动产生一个名为 Id 的非空自增实体键,如下图所示。
现在我们完善一下两个实体的属性,这里为了简便,所有的属性都设置为了 String 类型,对应到数据库即为 nvarchar(MAX)。这里其中一个属性用中文命名是想说明,C# 对中文是完全支持的。
在完成了实体的创建之后,下一步进行实体之间关系的创建,同样从工具栏中拖出一个关系到两个实体之间,因为用户与个人资料之间的关系是 1对1,所以选中关系后,在属性区修改其对应关系。
然后,在操作区点击右键,选择从模型生成数据库,根据指引,即可完成数据库的建立。
如果之前没有数据库连接的话,点击“新建连接”选项,按照你的需求选择,这里选择 SQL Server,输入相关信息后,即可完成连接的建立。
补充:如果此处输入的数据库名不存在,会自动创建对应数据库。
然后按照提示,可以得到自动生成的 SQL 文件,点击绿色按钮执行即可(此处同样要求输入数据库的账号密码)。
在完成创建后,到SQL Server Management Studio 中查看数据库即可发现,表已经被创建。
因为实体之间是 1对1 的关系,所以不会创建新的关系表,而是将其中一张表的主键附加到另一张表中,如下图所示。
下面来说一说如何通过创建的模型来访问数据库。
4.1 先来看一下 EF 框架帮我们创建的文件,如下图所示。4.2 我们新建一个名为 UI 的项目,用于展现界面与接受用户操作。因为本项目同样直接使用 EF 框架,所以在此项目中也需要引用 Entity Framework,同时引用 Model 项目。
(1) 使用 Nuget 引用 Entity Framework。
(2) 引用同解决方案的另一个项目 Model。
然后就可以方便地如下图所示一般使用“数据库”了,下图所示为两个实体对象集(可理解为数据表)。
4.3 通过 EF 框架实现查询功能。
// 登录
private void button_Login_Click(object sender, EventArgs e)
{
// 使用 EF 框架实现查询
User u=sstudentContainer.UserSet.Where(user => user.Userame == textBox_Username.Text && user.Password == textBox_Password.Text).FirstOrDefault();
// 如果查询不到,会返回 null
if (u != null)
{
new MyProfile(u).Show();
this.Hide();
}
else
{
MessageBox.Show("用户名或密码错误,请重试!");
}
}
4.4 通过 EF 框架实现插入功能。
// 注册
private void button_Signup_Click(object sender, EventArgs e)
{
try
{
// 使用 EF 框架实现添加新数据功能
User u = new User();
Profile p = new Profile(); u.Password = this.textBox_Password.Text;
u.Userame = this.textBox_Username.Text; p.Address = this.textBox_Address.Text;
p.Hobby = this.textBox_Hobby.Text;
p.PhoneNumber = this.textBox_PhoneNumber.Text;
p.Sex = this.textBox_Sex.Text;
p.StudentNumber = this.textBox_StudentNumber.Text;
p.姓名 = this.textBox_FullName.Text; u.Profile = p; // 添加两个新对象分别进入两张表
sstudentContainer.UserSet.Add(u);
// 因为 EF 会自动将关联的对象同时加入数据库,所以无需手动增加
//sstudentContainer.ProfileSet.Add(p); // 保存新增记录进入数据库
sstudentContainer.SaveChanges(); MessageBox.Show("注册成功!"); this.Close();
}
catch (Exception)
{
MessageBox.Show("抱歉,注册失败!");
throw;
} }
4.5 通过 EF 框架实现删除功能。
// 删除用户所有资料
private void button_Delete_Click(object sender, EventArgs e)
{
// 使用 EF 框架实现删除数据
try
{
// 需要首先使用 sstudentContainer 查找到该项记录(对象),然后将其删除
User u = sstudentContainer.UserSet.Where(user => user.Id == this.user.Id).FirstOrDefault();
Profile p = u.Profile; // 删除用户
sstudentContainer.ProfileSet.Remove(p);
sstudentContainer.UserSet.Remove(u); // 保存删除操作进入数据库
sstudentContainer.SaveChanges(); MessageBox.Show("再见,删除成功!"); this.Close();
}
catch (Exception)
{
// 发生异常,删除失败
MessageBox.Show("抱歉,删除失败!");
throw;
}
}
4.6 通过 EF 框架实现更新功能。
// 更新用户资料
private void button_Update_Click(object sender, EventArgs e)
{
// 使用 EF 框架实现更新数据
try
{
// 需要首先使用 sstudentContainer 查找到该项记录(对象),然后对其进行修改
User u = sstudentContainer.UserSet.Where(user => user.Id == this.user.Id).FirstOrDefault();
Profile p = u.Profile; u.Password = this.textBox_Password.Text;
u.Userame = this.textBox_Username.Text; p.Address = this.textBox_Address.Text;
p.Hobby = this.textBox_Hobby.Text;
p.PhoneNumber = this.textBox_PhoneNumber.Text;
p.Sex = this.textBox_Sex.Text;
p.StudentNumber = this.textBox_StudentNumber.Text;
p.姓名 = this.textBox_FullName.Text; // 保存更改进入数据库
sstudentContainer.SaveChanges(); MessageBox.Show("更新资料成功!");
}
catch (Exception)
{
// 发生异常,更新失败
MessageBox.Show("更新资料失败!");
throw;
} }
4.7 当我们尝试运行程序的时候,会发现出现异常,这是因为在 UI 项目中缺少了数据库连接字符串,即下图中的选中部分。只要将其复制,即可。
补充
EF 能帮我们做的事情还有很多,例如可以方便快捷地通过 ToList() 方法直接将数据库中所有数据转换为对象List。而本文只是一个简单的入门实例,只是仅仅帮助初次接触 EF 摸不到头脑的新手快速实战应用,需要学习的还有很多。如果本文有任何错误或不当之处,敬请指出,共同进步,谢谢~
附上源代码:
http://files.cnblogs.com/files/hiwangzi/Sstudent.zip
补充一个不错的视频(但是其中的实例演示并没有成功):
Entity Framework 實戰技巧 - YouTube
Code First 实例可以参考:
Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
其他可能对你有帮助的链接:
Entity Framework 新手入门友好实例的更多相关文章
- entity framework 新手入门篇(2)-entity framework基本的增删改查
经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...
- entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等
前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...
- entity framework 新手入门篇(1)-建立模型
entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...
- entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended
对于EF的操作,我们已经有了大概的了解了,但对于实战来说,似乎还欠缺着一些常用的功能,那就是批量的删除,更新数据. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller ...
- entity framework 新手入门篇(1.5)-lambda表达式与linq
在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...
- 实体框架(Entity Framework)快速入门--实例篇
在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...
- Entity Framework快速入门--ModelFirst
Entity Framework带给我们的不仅仅是操作上的方便,而且使用上也很是考虑了用户的友好交互,EF4.0与vs2010的完美融合也是我们选择它的一个理由吧.相比Nhibernate微软这方面做 ...
- Entity Framework快速入门--IQueryable与IEnumberable的区别
IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代.也就是说:实现了此接口的object,就可以直接使用foreach遍历此object: IQueryable 接口 ...
- Entity Framework 程序设计入门二 对数据进行CRUD操作和查询
前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...
随机推荐
- GIS制图人员的自我修养(1)--制图误区
GIS制图人员的自我修养 by 李远祥 最近一直坚持写GIS制图的技术专题,并不是为了要介绍有什么好的技术和方法去制图,而是要告诉所有从事这一方向的人员一个铁铮铮的实现--要做好GIS制图,必须加强自 ...
- 一个web应用的诞生--数据存储
上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据 ...
- PLSQL程序流程
IF语句结构: if(条件表达式)- -then- -执行语句;- -end; IF-THEN-ELSE语句结构: if(条件表达式)- -then- -执行语句;- -else- -执行语句;- e ...
- 矢量切片(Vector tile)番外一:Proj4js
说明:番外篇是对正篇矢量切片(Vector tile)中提到的一些值得继续延伸的关注点继续进行探索和学习,所涉及的内容以解决实际问题为主要导向. 一.新的需求? 在完成了矢量切片的工作后,新的需求出现 ...
- java中关于转义字符的一个bug
在java中,你可以定义 char c = '\u4f60'; char m = '\u0045'; char e = '\u554a'; 这样的字面量,例如: System.out.println( ...
- lazy ideas in programming
lazy形容词,懒惰的,毫无疑问是一个贬义词.但是,对于计算机领域,lazy却是非常重要的优化思想:把任务推迟到必须的时刻,好处是避免重复计算,甚至不计算.本文的目的是抛砖引玉,总结一些编程中的laz ...
- jQuery validata插件实现(每周一插件系列)
大家好,第一次写有点正规的博客,以前都是随手复制几下.为了打LOL,我写快点,代码我都复制在最下面了,并且写了大量的注释. 首先我写jquery插件,喜欢这么写(好处有很多,以后在讲,哈哈,看过jQu ...
- 对await(),notify()的理解
await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子. public class Account { pri ...
- vc release模式设置断点调试
在VC release模式做如下设置:在 工程->属性->c/c++->常规->调试信息格式选择 -> 程序数据库(/Zi) 在 工程->属性->链接器-&g ...
- Java Web(九) 用户管理系统
前面学习了一大堆,什么JSP,Servlet.jstl.el等等等,大多是一些死的东西,只要会其语法,知道怎么用就行了,所以做了一个小小的只有增删改查的小demo,为的就是熟悉这些知识.灵活运用起来. ...