zoukankan      html  css  js  c++  java
  • C#+EntityFramework编程方式详细之Code First 数据迁移

    在前几篇的C#+EntityFramework编程方式中介绍了C#+EntityFramework编程方式Code First ,Model First以及Dtatabase First 等编程方式,其中Model First以及Dtatabase First中,如果实体类(Model First)或者数据库(Dtatabase First)变化了,那么就需要数据库(Model First)或者实体类(Dtatabase First)来相应的变化,以保持实体类(Model First)和数据库(Dtatabase First)的表结构保持一致,Model First以及Dtatabase First这种实体类(Model First)和数据库(Dtatabase First)中的表结构保持一致比较好做,只要修改实体类(Model First)或者和数据库(Dtatabase First)中的表结构(表以及字段的修改),最后更新一下就好了,更新只要在在ADO.NET的 模型设计视图中,(如果是Model First)空白处右键选择 根据模型生成数据库(G)..,如果是Dtatabase First,从数据库更新模型(U)..)即可,这样就会更新数据库表结构和实体类,如下图所示:

    然而在C#+EntityFramework编程方式详细之Code First 中如果我们修改类实体类的话,重新运行的话就会报错(错误信息: InvalidOperationException,指出“创建数据库后,支持‘xxContext’上下文的模型已发生变化。请考虑使用 Code First 迁移更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)”),错误的原因是因为我们已经根据实体类生成数据库了,这时修改实体类的话再去操作生成数据库的就会报错了,那么我们要如何做呢,其实解决这种Code First 中修改类实体类,更新数据库的问题很简单,那就是需要进行数据迁移

    所谓的数据迁移,其实就是使用 Code First 迁移改进应用程序的数据库架构,生成迁移以跟踪对 EF 模型所做的更改。

    实体框架中的 Code First 迁移包括生成初始模型和数据库启用迁移生成和运行迁移,信息如果有兴趣的话可以阅读 Code First 迁移

    而本文介绍的是Code First 迁移,是在实体类变化以后,来重新更新数据库,为了与上篇的Code First加以区分,这里新建一个控制台程序EFDemoDBModelEFTestEmptyCodeFirst,然后添加新建项,选择 ADO.NET实体数据模型,名称输入EFTestCodeFirstEmpty,

    点击  添加

    选择   空Code First模型,点击  完成。默认生成如下

     

    为了演示方便,我们直接使用默认的的实体类 MyEntity(把上面MyEntity以及DbSet注释的放开)

     添加测试代码生成数据库(数据库本文是默认的,可以在app.config配置文件中修改)

    测试代码:

    运行结果如下,在localdb的mssqllocaldb实例中生成数据库EFTestCodeFirstEmpty.MyEmptyModel

     那么现在数据库已经生成,我们就来修改一下实体,然后在运行看看会有什么问题啊

    再运行一下(如下),看看错误信息,这错误信息就是 InvalidOperationException,指出“创建数据库后,支持‘xxContext’上下文的模型已发生变化。请考虑使用 Code First 迁移更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)”),错误的原因是因为我们已经根据实体类生成数据库了,这时修改实体类的话再去操作生成数据库的就会报错了,那么我们要如何做呢,其实解决这种Code First 中修改类实体类,更新数据库的问题很简单,那就是需要进行数据迁移

    下面为了解决这个问题,我们来进行下面操作也就是数据迁移

    首先找到vs工具栏中的  工具  选择NuGet包管理器 选择 程序包管理器控制台 , 在vs的下面就会添加   程序包管理器控制台,如下

     在vs的下面的程序包管理器控制台 里面   选择需要处理的 项目  本文是选择 EFTestCodeFirstEmpty

     

    1、在包管理器控制台中运行 Enable-Migrations 命令

    此命令已将“迁移”文件夹添加到项目中。 此新文件夹包含两个文件:

    • 配置类。 此类允许配置迁移对上下文的行为方式。 对于此演练,将只使用默认配置。 由于项目中只有一个 Code First 上下文,因此 Enable-Migrations 已自动填充此配置适用的上下文类型。
    • InitialCreate 迁移。 之所以生成此迁移,是因为在启用迁移之前,我们已使用 Code First 创建了数据库。 已构建的迁移中的代码表示已在数据库中创建的对象。 在本演练中,即为具有 Id 和“名称”列的 MyEntity 表。 文件名包含时间戳,这样有助于排序。如果尚未创建数据库,则不会将此 InitialCreate 迁移添加到项目中。相反,第一次调用 Add-Migration 时,会将创建这些表的代码构建到新的迁移中

    包管理器控制台中运行 Enable-Migrations 命令   结果如下

    2、Add-Migration 将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移

          在包管理器控制台中运行 Add-Migration 命令   结果如下

     3、Update-Database 将对数据库应用任意挂起的迁移

          在包管理器控制台中运行 Update-Database 命令   结果如下

       以上就就是C#+EntityFramework 中Code First 修改实体类来更新数据库的全部操作,其实总结起来很简单,只要第一次根据实体类生成过数据库,之后又有需要修改类实体类(添加字段,标识,限制等),那么只要在包管理器控制台中运行三个命令  即可根据修改的实体类来更新数据库。

      三个命令如下

    • Enable-Migrations
    • Add-Migration  注意执行该命令时 需要在Name之后添加名称   如 Name: 123
    • Update-Database    

    注解:

    Enable-Migrations 命令已将“迁移”文件夹添加到项目中。 此新文件夹包含两个文件:

    • 配置类。 此类允许配置迁移对上下文的行为方式。 对于此演练,将只使用默认配置。 由于项目中只有一个 Code First 上下文,因此 Enable-Migrations 已自动填充此配置适用的上下文类型。
    • InitialCreate 迁移。 之所以生成此迁移,是因为在启用迁移之前,我们已使用 Code First 创建了数据库。 已构建的迁移中的代码表示已在数据库中创建的对象。

    Add-Migration           将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移

    Update-Database     将对数据库应用任意挂起的迁移

  • 相关阅读:
    翻转数组
    股神
    刮刮卡兑换
    军训队列
    击鼓传花
    上台阶
    @Service空指针异常 -JUNIT测试
    insert 配置信息
    url地址重叠
    shop = mapper.readValue(shopStr, Shop.class); shop=null的问题
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/10778277.html
Copyright © 2011-2022 走看看