ORM框架:Entity Framework
1.Entity Framework的概念
什么是ORM
对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。即用操作对象的方式来操作数据库。
其它ORM框架:Dapper、NHibernate等。
Entity Framework介绍
在.NET3.5之前,我们经常编写ADO.NET代码来保存或检索底层数据库中的数据。做法是:打开过一个数据库的连接,创建一个DataSet来获取或提交数据到数据库,通过将DataSet中的数据和.NET对象相互转换来满足业务需求。这是一个麻烦且容易出错的过程。微软在2008年随.NET Framework 3.5 SP1发布了ADO.NET Entity Framework,一个附带有图形化设计器的面向实体数据库访问框架,用于执行所有上述与数据库相关的活动。
EF是一个适用于.NET开发的开源ORM框架。它使开发人员能够通过领域对象来处理数据,而无需关注存储此数据的基础数据库。使用实体框架,开发人员在处理数据时可以在更高的抽象级别上工作,并且与传统应用程序相比,可以使用更少的代码创建和维护面向数据的应用程序。
Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案。该框架曾经为.NET Framework的一部分,但Version 6之后从.NET Framework分离出来,可通过NuGet获取。
Entity Framework利用抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (Entity),而数据字段都转换为属性 (Property),关系则转换为结合属性 (Association),让数据库的E/R(实体-联系图)模型完全的转成对象模型,让程序设计师能用最熟悉的编程语言来调用访问。
2. Entity Framework使用说明
1.EF支持SQL Server、MySQL、Oracle等主流数据库。
2.EF采用约定大于配置的框架原则,能遵守约定就不要去配置。
3.EF开发数据库的两种形式先建数据库或者先建模型。
4.EF三种开发模式:
◆ DataBase First (数据库优先)
如果数据库已存在,可以使用VS自动生成数据模型以及相关的edmx文件。
使用简单、方便,适用于数据库会频繁修改来满足新的需求。
◆ Model First (模型优先)
如果数据库未创建,可以在VS中利用Model设计数据库,通过设计器生成映射信息(edmx文件),并生成数据库。开发中很少使用。
◆ Code First (代码优先)
可以通过设计的数据模型自动生成数据库,也可以通过已存在的数据库生成数据模型,进行数据库映射,都没有edmx文件。
EF三种开发模式使用比较:
3. Entity Framework的组成
下图很好地说明了EF的基本组成:
EF的组成简单总结如下:
1、EDM(实体数据模型):EDM包含三个主要部分——概念模型,映射和存储模型。
概念模型(entity):概念模型包含了模型类和它们之间的关系。 这将是独立于数据库表设计。
存储模型(data):存储模型是数据库设计模型,包括表、视图、存储过程、以及它们之间的关系。
映射(mapping):映射由概念模型如何映射到存储模型的信息组成。
2、LINQ To Entity: LINQ To Entity是一种的查询实体对象的语言, 它返回在概念模型中定义的实体。
3、Entity SQL:Entity SQL是一个类似于LINQ To Entity的查询语言。 然而,它比L2E更加复杂。
4、Object Services(对象服务):对象服务是访问数据库中的数据并返回数据的主要入口点。它负责数据实例化,把Entity Client Data Provider(下一层)的数据转换成实体对象。
5、Entity Client Data Provider:主要职责是将LINQ To Entity或Entity Sql转换成数据库可以识别的Sql查询语句,它通过ADO.Net Data Provider向数据库发送或者索取数据。
6、ADO.Net Data Provider:使用标准的Ado.net与数据库通信。
4.Demo演示
1.Sqlserver创建测试用表
create table userinfo ( userid varchar(50) PRIMARY key, username varchar(50) , password varchar(50) , phone varchar(50) ); select * from userinfo; --drop table userinfo;
2.新建Winform项目
项目中添加EF引用
Install-Package EntityFramework -Version 5.0.0
项目上新增Ado.net实体数据模型
配置
3.Demo演示代码
using System; using System.Linq; using System.Windows.Forms; namespace EntityFrameworkDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// 增 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("用户名不能为空!"); return; } using (var db = new developtestEntities()) { userinfo user = new userinfo(); user.userid = Guid.NewGuid().ToString(); user.username = textBox1.Text; user.password = textBox2.Text; user.phone = textBox3.Text; db.Set<userinfo>().Add(user); int n = db.SaveChanges(); textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; MessageBox.Show("新增" + n + "个用户!"); } } /// <summary> /// 删 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { int n = 0; var name = textBox1.Text; using (var db = new developtestEntities()) { var users = db.Set<userinfo>().Where(x => x.username == name).ToList(); foreach (var user in users) { db.Set<userinfo>().Remove(user); n += db.SaveChanges(); } } textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; MessageBox.Show("删除" + n + "个用户!"); } /// <summary> /// 改 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { var name = textBox1.Text; using (var db = new developtestEntities()) { var user = db.Set<userinfo>().FirstOrDefault(x => x.username == name); if (user != null) { user.username = textBox1.Text; user.password = textBox2.Text; user.phone = textBox3.Text; } var n = db.SaveChanges(); MessageBox.Show("修改" + n + "个用户!"); } } /// <summary> /// 查 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button4_Click(object sender, EventArgs e) { var name = textBox1.Text; using (var db = new developtestEntities()) { var user = db.Set<userinfo>().FirstOrDefault(x => x.username == name); if (user != null) { textBox1.Text = user.username; textBox2.Text = user.password; textBox3.Text = user.phone; } else MessageBox.Show("用户不存在!"); } } } }