开启Migration

1. 通过 Tools->Nuget Package Manager->Package Manager Console 打开Package Manager Console窗口

2. Default Project选择当前的DbContext所在的项目

3. 通过命令开启Migration

Enable-Migrations

开启之后,DbContext对应的项目中会生成一个Migrations的文件夹, 主要用来存放各个版本自动生成的更新描述文件

类似于下图:

初始化库

通常你新建了模型,在数据库建库之后需要执行一次add-migration命令生成一个库初始化的migration记录

add-migration 20160201003

后面部分的名字我通常都会按照当天日期拼接当天的版本号组成,另外一种不错的实践是按照增加的业务名称命名,英文名称会相对好点.

更新库

库的更新可以分为手动更新跟自动更新, 通常Code First Migration的文章都会讲这里要通过Update-Database命令来把刚才的变更更新到库里面, 通常DEV环境可以这么做,因为是直连的, 但是我们的Staging与Production环境是不可以直连的,我们要怎么做呢?

前面有提到可以自动更新,其意思就是说,你通过 add-migration生成了migration脚本,那当程序启动的时候,如果发现数库接口不一致,那这个就需要更新,这个时候如果是自动更新的状态,那程序会自动执行(从意思上等同于update-database, 产生的效果相同,但是并未实际考证是否也是跑的update-database命令), 因此无论是dev环境还是staging, production都可以通过自动update-database来完成数据库的更新。

如何设置自动更新

这里有两步:

1. 在migrations文件夹下有个configuration的文件, 代码如下:

public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}

AutomaticMigrationsEnable = true 之后, 设置EF为自动做数据库更新。

2. 在Global.cs或者任何程序启动的地方加入:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomerDbContext, Configuration>());

这句是设定当前DbContext的一个初始化配置.

潜在的问题

自动迁移,在某些该名称,或者删除字段的时候,会造成现有数据的丢失,这个需要注意,目前我也是在探索过程中,有进一步的研究成果,会在更新博文说明。

 

【补充部分】

初始化脚本的更新

public partial class InitDefaultData : DbMigration
{
public override void Up()
{
Sql(@"
--初始化FileType原始数据
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10001,'客户资料',0,GETDATE();
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10002,'订单资料',0,GETDATE();
insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10003,'车辆资料',0,GETDATE(); --初始化FileCategory原始数据
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),1,'图片',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),2,'复印件',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),3,'视频',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),4,'Excel文件',0,GETDATE();
insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),5,'Word文件',0,GETDATE();
");
} public override void Down()
{
Sql(@"truncate table FileType");
Sql(@"truncate table FileCategory");
}
}

可以通过Sql函数来执行一些自定义的SQL脚本。

EF Code First Migration总结的更多相关文章

  1. Some lines about EF Code First migration.

    Some lines about EF Code First migration: 一. 模型设计 1. 遵循EF标准,注意表关系配对 2. 数据模型里尽量把必须的属性和说明都写全 3. EF默认id ...

  2. EF Code First学习系列

    EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...

  3. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  4. 1.什么是Code First(EF Code First 系列)

    EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来 ...

  5. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  6. EF Code First 数据迁移配置

    这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践. 1.1 数据迁移综述 EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分 ...

  7. Sqlite && EF Code FIRST 终极解决方案 2019.5.17

    Sqlite && EF Code FIRST 终极解决方案 2019.5.17 包括根据模型自动生成数据库,初始化数据,模型改变时的自动数据迁移等 2019.12.25 更新 支持E ...

  8. 【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql进行业务操作 、配置swagger (三)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  9. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

随机推荐

  1. xfire webServeic 例子

    xfire webServeic 例子,参考网上众多例子,自己写得完成了,给大家分享 大家只要按这个目录去建文件就可以了,然后运行,至于其中原理慢慢理会吧 环境:myeclipse 10 +xfire ...

  2. webform页面传值和删除修改

    一.webform跨页面传值1.内置对象地址栏数据拼接 QueryString 优点:简单好用:速度快:不消耗服务器内存. 缺点:只能传字符串:保密性差(调转页面后在地址栏显示):长度有限.响应请求对 ...

  3. PHP数组的知识

  4. 用window.showModelDialog() 打开的页面的返回值

    有两个页面也个 Default1.aspx   另外一个是 Default2.aspx Default1.aspx 有个按钮是用来打开Default2.aspx页面的 按钮的js代码是 var win ...

  5. 学习笔记008之Task

    栈 为后进先出 如何实现一个弹出窗体.

  6. java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView

    最近在学习drawerLayout时,遇到这个bug.如下示: java.lang.ClassCastException: android.widget.RelativeLayout cannot b ...

  7. POJ 3180-The Cow Prom (图论-有向图强联通tarjan算法)

    题目大意:有n个牛在一块, m条单项绳子, 有m个链接关系, 问有多少个团体内部任意两头牛可以相互可达 解题思路:有向图强连通分量模版图 代码如下: #include<stdio.h> # ...

  8. Maven 自动部署

    自动部署到Tomcat Maven 3.2.5 JDK 1.7 Tomcat 7 首先在Tomcat里配置deploy的用户(tomcat根目录/conf/tomcat-users.xml): < ...

  9. Block的copy和循环引用的问题

    在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于是在目前的项目中大量的使用block. 在我的头文件我是这样声明使用block的. 我将block声明为 ...

  10. 10 个强大的开源 Web 流量分析工具(转帖)

    Web 流量分析工具多不胜数,从 WebTrends 这样专业而昂贵的,到 Google Analytics 这样强大而免费的,从需要在服务器端单独部署的,到可以从前端集成的,不一而足.本文收集并介绍 ...