任何一个和数据相关的系统里,数据持久化都是一个不容忽视的问题。

  一直以来,Java 平台出了很多 NB 的 ORM 框架,Hibernate、MyBatis等等。.NET 平台上,ORM 框架这一块一直没有一个能吊到让几乎所有开发人员改掉以拼写 SQL 语句访问数据库的习惯。

  实际上,在 .NET 平台上,也层出不穷的出现了很多类似的玩意儿,比如Nhibernate、Ibatis,还有微软的亲儿子——坑爹的 LinqToSQL。虽然这么多框架,但是真的没见过 .NET 平台的 ORM 框架能像 Java 里那样普及。

  所幸,微软又搞出来一个儿子——EntityFramework。前几个版本没用过,前几天直接了解了6.1.3版本的。。感觉,真 TMD 好用。。

  鉴于网上的所有教程都太教条式,入门时看起来很坑爹,所以将这篇心得做为随笔,供大家共同学习探讨。

一、安装框架

  首先,要添加环境。右键项目,可以在 NuGet 里直接安装。如下图:

  

  安装完成以后,项目引用里新增了两个关于EntityFramework的引用,如下图:

  到此,环境就配置好了。

 二、创建Context类和模型类

  0,准备数据库。

  写代码之前,我们得先有一个测试数据库,和一个测试表。

  这里我使用 SQLServer,表结构如下:

  EF的使用有三种模式:Model First、DataBase First 和 Code First。这几种First什么区别,没仔细研究。不过我这里使用的好像是 Code First 构建的项目。这种方式,我只是觉得方便,好用,感觉项目更干净,不用添加乱七八糟的代码和配置。

  1,添加模型类。

  EF 里的模型类和普通的类一样,无非是为类或属性添加一些属性标记对表的关系进行一些映射罢了。如下:

    [Table("Users")]
public class UserInfo
{
[Key]
[StringLength()]
[Column("Code")]
public string Code { get; set; } [StringLength()]
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了。

三、编写测试代码

  废话不说,上代码:

        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 方法将修改提交就行。

EntityFramework 简单入个门的更多相关文章

  1. vuex , 简单入(liao)门(jie)

    vuex什么 ? 官方的说法就是 vuex是专门为vue.js应用程序开发的 状态管理模式 .并采用集中式存储 , 管理应用的所有组件的状态 ,并以相同的规则保证状态以一种可预估的方式发生变化. 自己 ...

  2. webpack实践(一)- 先入个门

    一.前言   webpack是个啥呢?看官网的这段描述. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)   在我以前做纯html.css. ...

  3. 一起简单写一下AIDL,入个门

    前话 最近接触了Android开发的一个新知识,AIDL(¬_¬因为到现在都没用过) 因此不断谷歌找资料找Demo,自己尝试写一下. 因为用AndroidStudio作为开发环境,期间遇到过许多问题, ...

  4. Vue.js先入个门看看

    使用vue.js原文介绍:Vue.js是一个构建数据驱动的web界面库.Vue.js的目标是通过尽可能简单的API实现响应式数据绑定和组合的视图组件.vue.js上手非常简单,先看看几个例子: 例一: ...

  5. EntityFramework简单例子

    @(编程) 这个例子是用vs2013连接mysql数据库. 1. NuGet安装EF和mysql 略 2. 对象 namespace EFDemo { class Student { public s ...

  6. pytorch 学习--60分钟入个门

    pytorch视频教程 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量,其实就是一串数字,如(1,2) 矩阵(Matrix)是好几个向量拍成一排合 ...

  7. EntityFrameWork简单操作 EF数据上下文对象操作数据增删改差及批处理

    /// <summary> /// EF针对 留言数据库 的 数据上下文对象!!!! /// </summary> static LeaveWordBoradEntities ...

  8. hoj 棋盘问题 状压入个门

    大概题意是:有一个n*m的棋盘,在这个棋盘里边放k个旗子,要求每一行每一列都不能存在一对旗子相邻,问最后总共的方案数. 我们先来考虑个简单的,假如说只有一行,要求在这一行里边填充k个旗子,要求任意两个 ...

  9. 初次使用自己写的testbench 验证了简单的NOT门。

    先是简单的非门模型: module notgate(a,b); input a; output b; assign b=~a; endmodule 下面是自己写的简陋的testbench: `time ...

随机推荐

  1. [iOS]C语言技术视频-14-指针变量高级用法(函数指针)

    下载地址: 链接: http://pan.baidu.com/s/1ykyg2 密码: fg5t

  2. Halcon相关

      1.Halcon的自我描述 Program Logic Ø Each program consists of a sequence of HALCON operators Ø The progra ...

  3. javascript 数组合并

    javascript 中两个数组合并,当然可以遍历其中一个数组,通过push()方法将元素插入到另一个数组中. 另外,也可以使用内置的方法(javascript Array 对象上就具有的方法,或许比 ...

  4. openstack创建实例测试步骤

    source admin-openrc.shkeystone user-create --name=demo --pass=123456keystone tenant-create --name=de ...

  5. java中关于编码的问题(字符转换流及字符缓冲流 )

    上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流.使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式. OutputS ...

  6. bzoj3322 最大生成树+LCA

    题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金:然后按顺序走过n个点,求每个卖出黄金的点最多能卖出多少黄金 一开始有点懵,想着怎么再图上做这个问题,后来知道要先建一棵最大生成树 ...

  7. Codeforces#363 Div2

    A题: 题意:给定一些数,给定一些往左走和往右走的操作,问是否能够相遇,如果相遇请求出相遇时间 分析:对于相邻两个数,如果大的往左,小的往右就能够相遇,否则不能相遇,在求出所有相遇当中的第一次相遇即可 ...

  8. 用css制作一个三角形箭头

    剑走偏锋——用css制作一个三角形箭头   通常,我们做上图那个三角形,一般都是做张图,而且需要两张,因为一般都是下拉菜单的效果,需要有个hover的样式,箭头是反的.那是不是有更好的办法呢,毕竟要用 ...

  9. mysql、mysqli、pdo使用

    一.php手册关于MySQL的说明:    This extension is not recommended for writing new code. Instead, either themys ...

  10. Keil MDK下如何设置非零初始化变量(转)

    源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默 ...