EF-CodeFirst-数据迁移
数据迁移
之前说到Code-First中有不同的数据库初始化策略,如CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges和DropCreateDatabaseAlways。但是,这些策略存在一些问题,例如,数据库中已经有数据(种子数据除外)或现有的存储过程,触发器等。这些策略用于删除整个数据库并重新创建它,因此将丢失数据和其他数据库对象。
EF引入了一种迁移工具,可在模型更改时自动更新数据库模式,而不会丢失任何现有数据或其他数据库对象。它使用一个名为MigrateDatabaseToLatestVersion的新数据库初始化程序
有两种迁移方式:
- 自动迁移
- 基于代码的迁移
自动迁移
自动迁移可以通过enable-migrations在软件包管理器控制台中执行命令来实现。打开包管理器控制台,然后运行enable-migrations –EnableAutomaticMigration:$true命令(确保默认项目是上下文类所在的项目)。一旦命令成功运行,它将创建一个Configuration从项目DbMigrationConfiguration中的Migration文件夹派生的内部密封类
因为将数据上下文类放到了EntityFramework.Print项目中,故报这个错误;调整一下
Configuration类的构造函数中,AutomaticMigrationsEnabled设置为true。启用自动迁移,下一步是将上下文类中的数据库初始化程序设置为MigrateDatabaseToLatestVersion,如下所示。
删除数据库重新运行,第一次:
修改域模型,并重新添加新数据
Dept表已经根据域模型自动更新了,Person表中原先的数据也没有丢失
基于代码的迁移
基于代码的迁移提供了对迁移的更多控制,并允许配置其他内容,例如设置列的默认值,配置计算列等。为了使用基于代码的迁移,需要在Visual Studio的包管理器控制台中执行以下命令:
- Enable-Migrations: 创建Configuration类启用项目中的迁移.
- Add-Migration: 使用Up()和Down()方法根据指定的名称创建新的迁移类.
- Update-Database:执行由该Add-Migration命令创建的上一个迁移文件,并将更改应用于数据库模式。
和自动迁移区别AutomaticMigrationsEnabled=false;
使用Add-Migration
带有迁移类名称的命令创建迁移类,如下所示。
图中Up()方法包含用于创建数据库对象的Down()代码,该方法包含用于删除或删除数据库对象的代码。您也可以编写自己的自定义代码以进行其他配置。这比自动迁移更有优势。
使用add-migration
命令创建迁移文件后,必须更新数据库。执行Update-Database
命令来创建或修改数据库模式。使用该–verbose
选项查看要应用于目标数据库的SQL语句。
数据库已经被更新
回滚迁移
假设想要将数据库模式回滚到之前的任何状态,那么可以update-database使用–TargetMigration参数执行命令,使其返回到想要回滚的点。例如,假设有许多迁移应用于上面的EntityFramework.Base数据库,但您想要回滚到第一个迁移。然后执行以下命令。
update-database -TargetMigration:Base-v1
种子数据
可以在数据库初始化过程中将数据插入数据库表中。比如在数据初始化时给应用程序提供一些测试数据
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
EF-CodeFirst-数据迁移的更多相关文章
- EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- 【EF】EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- EF Code-First数据迁移的尝试
Code-First的方式虽然省去了大量的sql代码,但增加了迁移的操作.尝试如下: 1.首先要在“扩展管理器”里搜索并安装NuGet“库程序包管理器”,否则所有命令都不能识别,会报CommandNo ...
- EF CodeFirst数据迁移与防数据库删除
1 开启migrations功能 enable-migrations -force 2 添加迁移版本 add-migration 名称后缀 我们每次修改实体后,都应该使用这个add-migration ...
- Entity Framework CodeFirst数据迁移
前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- EF架构~CodeFirst数据迁移与防数据库删除
回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...
- codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库
一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...
- ASP.NET Core ef启用数据迁移
创建一个项目 通过Nuget获取EF Core相关的扩展包 appsettings.json 建立数据库连接串 创建数据库上下文EntityDbContext类,用于实体类映射数据库表 使用包管理器控 ...
- EF Core数据迁移操作
摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...
随机推荐
- 阅读《深入应用C++11:代码优化与工程级应用》
虽然一直是写C++的,但是却对C++11了解的不是太多,于是从图书馆借了本书来看 这本书分两大部分: 一.C++11的新特性讲解 二.工程级代码中C++11的应用 这样的安排很合理,第一部分把新特性讲 ...
- 省市区三级联动——思路、demo、示例
说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...
- phpcmsv9 管理加密解密
例子: 密码:123123 encrypt:Jiu5He 第一步: md5("123456")="4297f44b13955235245b2497399d7a93& ...
- 【iCore4 双核心板_ARM】例程二:读取ARM按键状态
实验原理: 按键的一端与STM32 PB9相连,另外一端接地,且PB9外接一个1K电阻大小的上拉电阻, 初始化时把PB9设置成输入模式,当按键弹起时,PB9由于上拉电阻的作用呈高电平(3.3V): 当 ...
- bootstrap 3.0 LESS源代码浅析(二)
border-radius是最常见的CSS3属性,但你知道他多少东西呢? 比如: border-radius:2em; 相当于什么? border-top-left-radius:2em; borde ...
- Git -- 使用GitHub
我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...
- 安装psycopg2时出错:Error: pg_config executable not found.
红帽系: 安装postgresql-devel Debian系: 安装libpq-dev
- Turning off “Language Service Disabled” error message in VS2017
We are getting the following "Error" message in our MVC web application in Visual studio 2 ...
- 服务器最大TCP连接数及调优汇总
启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是CPU计算型任务,那么线程数最多不超过 ...
- 使用 JdbcTemplate 查询数据时报错:列名无效(已解决)
又犯了一个错误. 争取没有下次了. 就算再犯,也要知道去哪找答案. 所以,记录一下,以示警戒. 报错 使用 JdbcTemplate 查询数据时,出现异常: PreparedStatementCall ...