EntityFramework 简单入个门

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

  一直以来,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(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了。

三、编写测试代码

  废话不说,上代码:

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

时间: 2024-12-23 14:23:23

EntityFramework 简单入个门的相关文章

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

vuex什么 ? 官方的说法就是 vuex是专门为vue.js应用程序开发的 状态管理模式 .并采用集中式存储 , 管理应用的所有组件的状态 ,并以相同的规则保证状态以一种可预估的方式发生变化. 自己理解的就是 vue提供的  前端数据管理仓库 . vuex中有五大核心概念 : 1. state 就是为了存储数据而存在的.包括全局所有的状态  (或者叫做数据源) 2.getter   (可以认为是 store的计算属性)   /* 补充:计算属性: 作用就是监听数据的变化 (个人理解), 每当s

C# EntityFramework简单入门

本文旨在通过一个小练习,对EntityFramework的Code First模式有一个简单的感性认识. 环境:VS2013,SQL Server 2012 打开"SQL Server Management Studio". 对象资源管理器中|数据库|右键|新建数据库,输入数据库名"BookShop",确定. 对象资源管理器中|数据库|BookShop|新建查询,在打开的新窗口中输入: CREATE TABLE Books ( [ID] INT NOT NULL P

Vue.js先入个门看看

使用vue.js原文介绍:Vue.js是一个构建数据驱动的web界面库.Vue.js的目标是通过尽可能简单的API实现响应式数据绑定和组合的视图组件.vue.js上手非常简单,先看看几个例子: 例一:Helloworld html代码: <div id="app"> {{ message }} </div> js代码: new Vue({ el: '#app', data: { message: 'Hello Vue.js!' } }) 例二:双向绑定 说明:h

Python是什么?简单了解pythonp-入门

简单了解python Python语言特色 Python是一门解释性语言 解释性语言:在系统中运行时需要使用解释器(如:php.java) 编译性语言:在系统中运行不需要解释器,可以直接运行(如:C.C++)创一个小群,供大家学习交流聊天如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学python能够持之以恒python爱好群,如果你想要学好python最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐

入了门的小生给菜鸟一点经验

不知不觉 过了6个月了,今天正好把做好的APP送去百度云测试,如果通过就可以上市场了,其实你看我博客就知道我是什么时候开始学安卓的. ①开始学安卓的人,你要想你为什么要学? 我先告诉你一个现实 你知道一线城市的其他行业经理一个月多少钱么? 你知道别人努力在外面累死累活的 一个月多少钱么? 你知道过年回去别人问你多少工资的时候,你会怎么说? 第一个 答案 8K 第二个 答案 5-6K 第三个 你可以很骄傲的说8K+ ② 安卓是什么? 第一个:安卓是一个们无限接近科学的技术,这是一个门槛,注定有人学

搞定接口,网络入了门

接口在网络中重要啊,网络设备说白了不就是把一个接口转换成另外一个接口么? 逻辑接口,这些逻辑接口简直比物理接口还要重要,相当有用. 逻辑接口指能够实现数据交换功能但物理上不存在.需要通过配置建立的接口,包括子接口.Trunk接口.VLANIF接口.虚拟接口模板VT(Virtual-Template).Loopback接口.NULL0接口.Tunnel接口等. 目的 ·        子接口,我的最爱,一条链路可以配置很多业务. ·        Trunk Trunk是一种捆绑技术.将多个物理接

js实现简单的滑动门和tab选项卡

思想:首先定义三个选项卡,可以用任何标签,只要如下图, 一共有三个ul,第一个ul给一个class,因为默认第一个选项卡的内容显示出来, 其他两个ul  display:none: 当我鼠标移到第二个第三个选项卡的时候,删除第一个选项卡的class,鼠标移到哪里就给哪个选项卡那个class 思路就這样 下面是完全的代码 最好自己写写,然后参考自己下面的代码 <!DOCTYPE html> <html> <head> <meta charset="utf-

状压dp入门

(先处理好基本的位运算的东西) 为了更好的理解状压dp,首先介绍位运算相关的知识. 1.'&'符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值.例如3(11)&2(10)=2(10). 2.'|'符号,x|y,会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值.例如3(11)|2(10)=3(11). 3.'^'符号,x^y,会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值.例如3(11)^2(10)=1(01). 4.'<&

laravel数据库迁移(三)

laravel号称世界上最好的框架,数据库迁移算上一个,在这里先简单入个门: laravel很强大,它把表中的操作写成了migrations迁移文件,然后可以直接通过迁移文件来操作表.所以 , 数据迁移文件就是 操作表的语句文件 操作表的语句文件为什么用迁移文件 , 而不直接敲 sql 操作表 ?1.  便于团队统一操作表.2.  出了问题,容易追查问题和回溯,有历史回退功能. 先创建一个库: 配置一下文件,修改.env中的参数 cmd.exe命令行输入如下命令创建一个表的迁移文件:php ar