深刻了解Entity Framework框架及访问数据的几种方式

1、前言

一、Entity Framework概要

    Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案。该框架曾经为.NET Framework的一部分,但Version 6以后从.NET Framework分离出来,可经过NuGet获取。数据库

    Entity Framework利用抽象化数据结构的方式,将每一个数据库对象都转换成应用程序对象 (Entity),而数据字段都转换为属性 (Property),关系则转换为结合属性 (Association),让数据库的E/R(实体-联系图)模型彻底的转成对象模型,让程序设计师能用最熟悉的编程语言来调用访问。编程

二、什么是ORM

    对象-关系映射(Object Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操做实体对象的时候,就不须要再去和复杂的SQL语句打交道,只需简单的操做实体对象的属性和方法。即用操做对象的方式来操做数据库。服务器

    其它ORM框架:Dapper、NHibernate等。数据结构

三、Entity Framework使用说明

    ①、EF是创建在ADO.NET框架之上的,底层使用的是ADO.NET方法和类来执行数据操做,具体以下图所示:app

    ②、EF支持SQL Server、MySQL、Oracle等主流数据库。框架

    ③、EF采用约定大于配置的框架原则,能遵照约定就不要去配置。编程语言

    ④、EF开发数据库的两种形式先建数据库或者先建模型ide

    ⑤、EF三种开发模式:函数

      ◆ DataBase First (数据库优先)学习

         若是数据库已存在,可使用VS自动生成数据模型以及相关的edmx文件

         使用简单、方便,适用于数据库会频繁修改来知足新的需求。会出现修改了数据库在程序中更新EF不起做用等问题。

      ◆ Model First (模型优先)

         若是数据库未建立,能够在VS中利用Model设计数据库,经过设计器生成映射信息(edmx文件),并生成数据库。开发中不多使用。

      ◆ Code First (代码优先)(*)

         能够经过设计的数据模型自动生成数据库,也能够经过已存在的数据库生成数据模型,进行数据库映射,都没有edmx文件。

         彻底控制代码,即没有自动生成的模型和上下文代码。

         数据库由EF帮助生成,当修改模型后,EF使用DB Miguration自动帮助修改数据库,但也能够禁用Miguration,手动建立(推荐)

         上图中前三种分别是DataBase First、Model First 和Code First,而第四种也是Code First。

         那么第三个和第四个到底有什么区别?项目中如何使用?下面将会重点讲解。(*)

    ⑥、EF三种开发模式使用比较,以下图所示:

 

说明

使用

Database First (数据库优先)

数据库已存在(生成edmx文件)

数据库频繁改变

Model First (模型优先)

数据库未存在(生成edmx文件)

开发中不多使用

Code First(代码优先)

数据库存在/未存在(没有生成edmx文件)

彻底控制代码

能够禁用数据迁移

手动修改数据库和实体类

2、Entity Framework 访问数据三种方式

一、DataBase First模式

1.一、建立

    ①、建立一个应用程序选择(.NET Framework类库),选择“添加” ->“新建项”->点击“数据”->选择“ADO.NET 实体数据模型”,具体以下图所示:

    ②、选择模型内容来自“数据库的EF设计器”,具体以下图所示:

    ③、点击新建链接如图二所示,选择数据库地址、链接方式和数据库,而后配置数据链接字符串如图一所示,具体以下图所示:

    ④、选择要映射的“PersonInfo”表,具体以下图所示:

    ⑤、建立完模型以后,你会发现Visual Studio自动生成了“Person”实体类和一个“EntityModelContext”数据库上下文操做类,具体以下图所示: 

1.二、应用

    查询数据,建立控制台应用程序,经过NuGet包管理器,添加“Entity Framework”引用,而后配置相应的App.config的数据库链接,建立测试代码:

static void Main(string[] args)
{
    //实例化数据库上下文
    using (var dbContext=new DemoDBEntities() )
    {
        //使用Lambda表达式查询数据
        var info = dbContext.PersonInfo.Where(i => i.Name == "ZhangSan").ToList();

        //使用Linq语句查询
        var info1 = from i in dbContext.PersonInfo
                    where i.ID == 1
                    select i;

        //获取查询结果
        foreach (var item in info)
        {
            Console.WriteLine(" Lambda方式的查询结果:姓名:" + item.Name +" 年龄:"+item.Age);
        }

        //foreach (var item in info1)
        //{
        //    Console.WriteLine(" Linq  方式的查询结果:姓名:" + item.Name + " 年龄:" + item.Age);
            
        //}
        Console.ReadLine();
    }
}

    结果以下图所示:

1.三、说明

    Database First是以数据库为中心的开发方式;

    使用这种模式必需要先设计和建立数据库,而后使用VS在已有数据库的基础上建立ADO.NET实体数据模型,而后使用EF访问和操做数据库;

    若是数据库表结构发生改变后,只需在模型设计视图空白处右键,选择“从数据库更新模型”接着按照向导操做便可完成模型更新;

    上面只是演示了一个查询的小功能,EF的强大机制还需动手实践和操做。

二、Model First模式

2.一、建立

    ①、建立一个应用程序选择(.NET Framework类库),选择“添加” ->“新建项”->点击“数据”->选择“ADO.NET 实体数据模型”,具体以下图所示:

    ②、选择模型内容来自“空EF设计器模型”,具体以下图所示:

    ③、开始设计实体,在空白处右击,添加实体(UserInfo)和实体的属性(eg:ID、Name、Age)等 ,具体以下图所示:

    ④、实体模型设计完成,接下来要生成数据库,选择“根据模型生成数据库”,具体以下图所示:

    ⑤、建立数据库,填写相应的数据库链接属性,具体以下图所示:

    ⑥、EF模型选择和Visual Studio自动生成DDL文件,具体以下图所示:

    ⑦、选择自动建立的SQL脚本,此时数据已生成,执行脚本生成所须要的表,具体以下图所示:

    ⑧、打开数据库,能够看到建立的数据库以及表,具体以下图所示:

2.二、应用

    查询数据,建立控制台应用程序,经过NuGet包管理器,添加“Entity Framework”引用,而后配置相应的App.config的数据库链接,建立测试代码:

static void Main(string[] args)
{
    using (var dbContext = new ModelFirstContainer())
    {
        //添加
        UserInfo userModel = new UserInfo();
        userModel.Name = "WangWu";
        userModel.Age = 18;
        dbContext.UserInfo.Add(userModel);
        dbContext.SaveChanges();

        //Linq查询 
        var list = from i in dbContext.UserInfo
                   where i.Name == "ZhangSan"
                   select i;

        //Lambda 表达式查询
        var info = dbContext.UserInfo.Where(i => i.Name == "ZhangSan").ToList();

        //获取数据
        foreach (var item in list)
        {
            Console.WriteLine(" Linq  方式的查询结果:姓名:" + item.Name + " 年龄:" + item.Age);
        }

        foreach (var item in info)
        {
            Console.WriteLine(" Lambda方式的查询结果:姓名:" + item.Name + " 年龄:" + item.Age);
        }
        Console.ReadLine();
    }
}

     结果以下图所示:

2.三、说明

    ModelFirst模式是实体模型先行的开发方式;

    先设计实体,而后根据实体再去生成数据库而且进行相应的操做;

    使用这种方式的惟一缘由就是想体验视觉实体设计器。

三、Code First模式

    文章开始说到的Code First模式有两种选择一种是“空CodeFirst模型”,另外一种是“来自数据库的CodeFirst”,具体以下图所示:

    上图分别对两种模式进行了描述,那它们到底该如何使用以及区别是什么?请看下面的例子。

3.一、空Code First模式

    一、建立

    ①、建立一个应用程序选择(.NET Framework类库),选择“添加” ->“新建项”->点击“数据”->选择“ADO.NET 实体数据模型”,具体以下图所示:

    ②、选择模型内容来自“空Code First模型”,具体以下图所示:

    ③、点击完成,具体以下图所示:

    经过上图咱们能够看到生成相应的数据库上下文以及数据库链接字符串。(能够根据本身的需求进行修改配置以及添加对应的实体)

    二、应用

    1)、链接配置文件(修改数据库链接字符串,改为咱们要存放数据库服务器名)

<connectionStrings>
           <add name="CodeDB" connectionString="data source=.;initial catalog=CodeDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" 
providerName
="System.Data.SqlClient" /> </connectionStrings>

    2)、代码示例:

static void Main(string[] args)
{
    using (var dbContext=new CodeDB() )
    {

        UserInfo userModel = new UserInfo();
        userModel.Name = "ZhangSan";
        dbContext.UserInfo.Add(userModel);
        dbContext.SaveChanges();
        Console.ReadKey();
    }
}

    3)、运行上面代码,“空Code First模型”,生成的数据库以下图所示:

    从上图能够看出:

    一、自动生成数据库CodeDB;

    二、数据库中生成一张叫__MigrationHistory 的表(是用于记录代码迁移的历史记录,也是代码迁移模式的开关,后面会聊);

    三、数据库中还建立一张实体类型(UserInfoes的表),包括字段名以及字段类型等信息;

    四、利用代码添加一条数据到UserInfoes的表中。

    以上就是经过空Code First模式建立的数据库以及表(经过代码实现数据的建立以及表添加)上面的示例操做到这一步都显示正常,可是咱们在实际开发中,

    有时须要向数据库中添加表以及修改表字段和属性,那如今咱们在实体的代码中添加一个Age字段,具体以下所示:

public class UserInfo
{
    public int Id { get; set; }
    public string Name  { get; set; }

    //实体中添加Age字段
    public string Age { get; set; }
}

    如今运行程序

    程序出现异常,那咱们来看看什么意思“从数据库建立以来支持CODEDB上下文的模型发生了变化,考虑使用代码第一迁移来更新数据库”,

    说的就是模型与实际数据库结构不一致,须要使用 Code First 中的数据迁移功能来解决问题,下面咱们就来看看数据迁移。

    三、数据迁移的用法

    一、什么状况须要进行数据迁移

    在开发中使用空Code First模式,若是涉及到数据表的变动以及字段修改等操做,该如何作呢?固然若是是新项目,删除数据库,而后从新生成就好了,

    那么若是是线上的项目,数据库中已经有数据了,那么删除数据库从新生成就不行了,那么该如何解决呢?EF Code First提供了一种数据迁移的操做。

    二、如何进行数据迁移

    ●  手动迁移

    当模型与实际数据库结构不一致时,就须要使用数据迁移。数据迁移咱们须要掌握三个方法,它们分别是:

      1) 在当前项目中启用数据迁移 Enable-Migrations

      2) 添加迁移版本 Add-Migration 版本名称

      3) 更新数据库 Update-Database

    第一步,选择须要启用数据迁移的项目,打开“视图”->“其它窗口”->“程序包管理器控制台” 或者能够按快捷键 Alt+V,E,O,

    而后输入命令:Enable-Migrations,具体以下图所示: 

    显示当前项目中已启用数据迁移,项目中会多出 Migrations文件夹以及相关代码(Migrations文件夹主要是数据迁移的信息),具体以下图所示

    第二步因为咱们的模型已经发生了改变,因此须要添加一个新的迁移版本,在程序包管理控制台

    执行以下命令:Add-Migration v1.0 ( 其中的v1.0表示版本号,名称能够自定义),此时再看项目中就会多出一个文件:

    第三步经过数据迁移代码能够看到数据库是如何进行更新和修改,想要让数据库发生改变,为表添加一个Age字段,

    仍是须要用到第三个命令:Update-Database(执行成功以后,表中就会添加一个 Age字段)

    完成以上三个步骤,此时的模型与实际数据库结构已经一致,再运行程序,程序就不会报错了。

    ●  自动迁移

    上面咱们利用命令方式手动完成数据迁移的,那么若是咱们在实际开发中,每次修改完模型都要这样更新数据库吗?若是表中有数据时,是否会丢失数据?

    固然还有一种方式自动迁移,咱们须要在项目中启用Migrations,而后在Configuration类中设置AutomaticMigrationsEnabled设置为true

    还须要在DbContext构造函数中写上这句

    Database.SetInitializer(new MigrateDatabaseToLatestVersion<EntityContext, Configuration>("DBConnectionString")),

    经过构造函数把数据库更新为最新,具体以下图所示:

    说明:若是不喜欢自动迁移,能够手工完成这个操做。手工迁移的好处后,能够随时退回到某个指定的迁移版本。迁移文件也能够进行版本管理有利于团队开发。

    经过使用Code First模式建立出来的数据库,默认是开启了数据迁移,若是咱们模型进行了修改,那么就须要在项目中开启数据迁移,进行模型和数据库同步。

    数据迁移有分为手动迁移和自动迁移,上面已讲解,能够根据本身的项目需求进行选择。

    可是在实际开发中进行数据迁移不免会出现一些问题,若是数据库存有大量数据,迁移过程有可能致使数据丢失,每次更新模型都要进行数据迁移,

    给咱们开发带来不少不便,可是仍是想用代码先行模式开发,那么我就可使用“来自数据库的Code First”的方式,默认是关闭数据迁移的,

    方便咱们随时修改数据库以及模型,提升开发效率,推荐使用,请看下面讲解。

3.二、来自数据库的Code First

    一、场景

     ◆ 数据库已存在而且不想启用数据库迁移;

     ◆ 习惯经过手动修改实体类,手动修改数据库表结构,来同步数据库和模型;

     ◆ 实现代用优先原则。

    二、建立

    ①、建立一个应用程序选择(.NET Framework类库),选择“添加” ->“新建项”->点击“数据”->选择“ADO.NET 实体数据模型”,具体以下图所示:

    ②、选择模型内容来自“来自数据库的Code First”,具体以下图所示:

    ③、选择链接建据库,填写相应的数据库链接属性,具体以下图所示:

    ④、选择须要的数据库对象,具体以下图所示:

    ⑤、点击完成,项目中生成相应的数据库上下文,具体以下图所示:

    三、应用
static void Main(string[] args)
{
    using (var dbContext=new CodeEntity() )
    {
        PersonInfo userModel = new PersonInfo();
        userModel.Name = "LiSi";
        dbContext.PersonInfo.Add(userModel);
        dbContext.SaveChanges();
        Console.ReadKey();
    }
}
    四、说明

    经过上面的示例代码运行咱们能够看到,“来自数据库的Code First”,咱们能够经过手动建立数据库,手动修改实体,方便咱们随时修改数据库和实体,

    并且还不会生成__MigrationHistory 的表,也不用进行数据迁移,这种方式能够更好地提现Code First的好处。

3.3 、Code First 模式总结

    1)Code First模式中,当模型与表结构不一致时,程序会报错,有两种方式使模型和表结构一致,一种是手动修改模型代码和表结构,另外一种是使用数据迁移功能。

       这两种方式不是想选哪个就选哪个,取决因而否使用了数据迁移 。

    2)使用空Code First模型建立的数据库默认是开启数据迁移的;

    3)使用来自数据库的Code First模式中的数据库,默认是关闭数据迁移的。

    4)使用来自数据库的Code First模式,经过手动改写实体类,手动改数据库表结构,来同步模型与实际表结构,能够彻底本身控制代码,推荐使用。

3、Entity Framework 总结

    Database First:用于数据库已经存在,可使用VS自动生成数据模型,已经相关的edmx信息。

    Model First:数据库未建立,能够在VS中利用Model设计数据库,经过设计器生成映射信息(edmx文件),并自动生成数据库。

    Code First:经过设计的数据模型自动生成数据库,不须要额外edmx文件,也可经过已存在的数据库生成数据模型,进行数据库映射,一样不须要edmx文件。

 

优秀是一种习惯,欢迎你们关注学习 

相关文章
相关标签/搜索