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 将对数据库应用任意挂起的迁移
C#+EntityFramework编程方式详细之Code First 数据迁移的更多相关文章
- C#+EntityFramework编程方式详细之Code First
Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...
- C#+EntityFramework编程方式详细之Model First
Model First Model First模式即“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在VS中 ...
- C#+EntityFramework编程方式详细之Database First
Database First “Database First”模式即“数据库优先”,其实Database First 与Model First 很类似,只不过一个是有数据可一个是创建数据库,具体的操作 ...
- Code First 数据迁移 转
一.为模型更改设置 Code First 数据迁移 1.工具—>库程序包管理器—>程序包管理器控制台—>输入“Enable-Migrations” 或者 Enable-Migrat ...
- EF Code First 数据迁移配置
这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践. 1.1 数据迁移综述 EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分 ...
- 图文详解 解决 MVC4 Code First 数据迁移
在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题 这时可以删除数据库重新生成解决 但是之前的数据就无法保留 为了保留之前的数据库数据 我们需要使用到C ...
- 解决 MVC4 Code First 数据迁移 数据库发生更改导致调试失败解决方法(二)
文章转载自:http://www.cnblogs.com/amoniyibeizi/p/4486617.html 前几天学MVC过程中,遇到更改Model类以后,运行程序就会出现数据已更改的问题导致调 ...
- EF三种编程方式详细图文教程(C#+EF)之Code First
Code First Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的 ...
- EF三种编程方式详细图文教程(C#+EF)之Database First
Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下 ...
随机推荐
- SqlServer2008_r2安装功能选择
勾上数据引擎服务.客户端工具链接.sdk.管理工具.客户连接SDK.最后一个 sql2008安装时,怎么选择服务账户NT Authority\System ,系统内置账号,对本地系统拥有完全控制权限: ...
- 数据库和SQL面试题基础知识(持续更新)
数据库方面基础知识复习 常问小问题: 一.like查询大小写问题: sql查询结果去重 SELECT distinct name FROM 表:平均数avg 一.like查询大小写问题: ①用bina ...
- nginx代理部署Vue与React项目
nginx代理部署Vue与React项目 一,介绍与需求 1.1,介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由 ...
- Ubuntu16.04安装Redis并配置
Ubuntu16.04安装Redis并配置 2018年05月22日 10:40:35 Hello_刘 阅读数:29146 Ubuntu16.04安装Redis并配置 1):安装: 1:终端命令下载 ...
- centos7下使用LVM给系统硬盘扩容超详细
简单介绍: LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的 ...
- 这可能是最为详细的Docker入门吐血总结
这可能是最为详细的Docker入门吐血总结 https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...
- PMP备考资料和备考经验分享(基于PMP第六版)
之前有不少小伙伴私信我说,你PMP考过了,有没有报班呢,有没有自己看的资料,有没有一些经验分享,今天在这里,就统一给大家分享一下,以便大家备考和学习PMP. 先说我自己的情况,我本身是从事项目管理的, ...
- 第四章:条件语句(if)和循环结构(while)
1.流程控制 含义与作用 Python程序执行,一定按照某种规律在执行 a.宏观一定是自上而下(逻辑上方代码一定比逻辑下方代码先执行):顺序结构b.遇到需要条件判断选择不同执行路线的执行方式:分支结构 ...
- pthread_cond_wait学习笔记
pthread_cond_wait学习笔记 近期学习了线程等待和激活的相关知识. 先介绍几个api: pthread_cond_t表示多线程的条件变量,用于控制线程等待和就绪的条件. 一:条件变量的初 ...
- MSSQL Server2012备份所有数据库到网络共享盘上面,并自动删除几天前的备份。。
--要备份到哪一服务的IP网络位置,要提前打开文件夹共享.这里还要输入用户名和密码,下面这一行是建立共享 exec master..xp_cmdshell 'net use \\192.168.8.1 ...