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     将对数据库应用任意挂起的迁移

 

posted @ 2019-04-27 12:05  龙骑科技  阅读(915)  评论(0编辑  收藏  举报