任何一个和数据相关的系统里,数据持久化都是一个不容忽视的问题。数据库
一直以来,Java 平台出了不少 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平台上,ORM 框架这一块一直没有一个能吊到让几乎全部开发人员改掉以拼写 SQL 语句访问数据库的习惯。框架
实际上,在 .NET 平台上,也层出不穷的出现了不少相似的玩意儿,好比Nhibernate、Ibatis,还有微软的亲儿子——坑爹的 LinqToSQL。虽然这么多框架,可是真的没见过 .NET 平台的 ORM 框架能像 Java 里那样普及。ide
所幸,微软又搞出来一个儿子——EntityFramework。前几个版本没用过,前几天直接了解了6.1.3版本的。。感受,真 TMD 好用。。学习
鉴于网上的全部教程都太教条式,入门时看起来很坑爹,因此将这篇心得作为随笔,供你们共同窗习探讨。测试
1、安装框架ui
首先,要添加环境。右键项目,能够在 NuGet 里直接安装。以下图:spa
安装完成之后,项目引用里新增了两个关于EntityFramework的引用,以下图:hibernate
到此,环境就配置好了。code
2、建立Context类和模型类orm
0,准备数据库。
写代码以前,咱们得先有一个测试数据库,和一个测试表。
这里我使用 SQLServer,表结构以下:
EF的使用有三种模式:Model First、DataBase First 和 Code First。这几种First什么区别,没仔细研究。不过我这里使用的好像是 Code First 构建的项目。这种方式,我只是以为方便,好用,感受项目更干净,不用添加乱七八糟的代码和配置。
1,添加模型类。
EF 里的模型类和普通的类同样,无非是为类或属性添加一些属性标记对表的关系进行一些映射罢了。以下:
[Table("Users")] public class UserInfo { [Key] [StringLength(20)] [Column("Code")] public string Code { get; set; } [StringLength(20)] public string Name { get; set; } }
上面代码中,定义了如下几个关键信息:
1,类 UserInfo 对应数据库里的 Users 表。
2,Code 属性对应数据库里的 Code 字段(若是属性名和字段名相同,能够忽略这个配置,好比 Name 属性)。
3,而且指明两个字符型属性的长度不能超过20个字符。
4,指示 Code 属性所对应的列是主键列。
(注:Table、Key、StringLength、Column 这几个类须要引用命名空间 System.ComponentModel.DataAnnotations 和 using System.ComponentModel.DataAnnotations.Schema )
2,添加 DbContext 类。
DbContext 类是 EF 的核心,封装了全部数据存取业务相关的逻辑。不论是增删改查仍是事务什么什么,全部的数据库操做的业务均可以在这里搞定。。听起来很牛逼!
听起来很牛逼,事实上更牛逼!
虽然很牛逼,可是用起来超级简单。好比像下面的代码,就实现了一个简单的 DbContext 类:
public class DALContext : DbContext { public DALContext() : base("name=DALContext") { } public virtual DbSet<UserInfo> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }
寥寥几行,完成了复杂的 DB 操做。
上面代码简单说明一下:
1,这个类名本身起,想叫啥叫啥,我这里叫 DALContext。
2,这个类必需继承 DbContext 类。
3,在构造方法里,调用父类的构造方法,指明如何链接数据库,这里能够是链接字符串,也能够是配置文件里配置的链接名称(链接名称必需前缀 name= )。
4,virtual 声明的 DbSet<T> 类型的属性里封装了一大堆数据操做的业务逻辑,咱们只须要操做该属性就好了。
5,有几个表,就声明几个 DbSet<T> 类型的属性就好了。T 是前面代码中声明的 Model ,属性名本身随便起。
6,OnModelCreating 方法有什么用?具体的我也不知道。
(这个类要引用命名空间 System.Data.Entity)
3,配置链接字符串
打开配置文件,添加一个名为 DALContext 的链接字符串配置。以下图:
(打开配置文件咱们会发现,里面多了一些关于 entityFramework 的奇怪的东西。至因而不是必要的,删了会不会死人,我也不知道)
至此,数据库表的映射就Ok了。
3、编写测试代码
废话不说,上代码:
static void Main(string[] args) { using (DALContext db = new DALContext()) { try { db.Users.Add(new UserInfo() { Code = DateTime.Now.Ticks.ToString(), Name = "张三" }); IEnumerable<UserInfo> users = db.Users.Where<UserInfo>(u => u.Name == "张三"); foreach(var u in users) { Console.WriteLine(string.Format("{0} - {1}",u.Code,u.Name)); } db.SaveChanges(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.WriteLine("Press any key to exit"); Console.ReadKey(); }
在 Main 方法里,咱们声明了一个 DALContext 对象 db,为了便于对象资源的释放,这里使用 using 将其包起来。
这段代码实现了如下功能:
1,访问 db 对象 的 Users 属性,使用 Add 方法像操做一个集合同样向数据库表里增长一条记录。
2,访问 db 对象 的 Users 属性,使用 Where 方法根据条件查询一批数据对象,保存在变量 users 里,并循环输出到控制台。
3,使用 db 对象的 SaveChanges 方法,将对数据库的变动提交。
运行之后,结果以下:
上面例子实现了增长和查询功能,删除和修改功能相似于操做集合,只要保证最后调用 SaveChanges 方法将修改提交就行。