【迁移】—Entity Framework实例详解

2023-05-16

 好久没有在博客园更新博客了,如今都换了新公司。前段时间写了关于EF迁移的文档,今天拿出来作为这个系列的一篇吧。

一、Entity Framework 迁移命令(get-help EntityFramework)

Enable-Migrations 启用迁移

Add-Migration 为挂起的Model变化添加迁移脚本

Update-Database 将挂起的迁移更新到数据库

Get-Migrations 获取已经应用的迁移

二、自定义迁移

现有一个Demo,有如下Product模型:


   1:  public class Product  

   2:  {  

   3:     

   4:  public int ProductId { get; set; }  

   5:     

   6:  public string ProductName { get; set; }  

   7:     

   8:  public decimal Price { get; set; }  

   9:     

  10:  }  

 修改Product,添加如下两个属性:


   1:  public DateTime CreateDate { get; set; }  

   2:     

   3:  public string Unit { get; set; }  

 其中,CreateDate和Unit都是必须的。

1. Enable-Migrations

在Package Manager Console中执行Enable-Migrations启动迁移。

执行get-help Enable-Migrations –detailed 查看Enable-Migrations的详细用法。

-ContextTypeName 指定要使用的Context

-EnableAutomaticMigrations 启动自动迁移

-ProjectName 指定搭建的迁移类添加到的项目

-StartUpProjectName 指定使用的配置文件所在的项目

-ConnectionStringName 指定使用配置文件中连接字符串的名称

-ConnectionString 指定使用的连接字符串

-ConnectionProviderName 指定连接字符串的provider名称

-Force 重写迁移配置

本Demo中执行

Enable-Migrations -ProjectName Demo.Domain -StartUpProjectName MigrationsDemo

 执行结果是:检测到数据库是由database initializer创建,为现有的数据库搭建初始化迁移脚本。本Demo中是在Demo.Domain项目中创建了一个Migrations文件夹,以及Migrations中的2个文件:Configuration.cs和201311010641361_InitialCreate.cs

Configuration 类。此类允许您针对上下文配置迁移的行为。

InitialCreate 迁移。此迁移已在启用迁移之前生成,因为我们事先让 Code First 自动创建了一个数据库。此基架迁移中的代码表示数据库中已创建的对象。

如果尚未创建数据库,则不会将此 InitialCreate 迁移添加到项目中。而是,首次调用 Add-Migration 时,用于创建这些表的代码将为新迁移搭建基架。

2. Add-Migration

在Package Manager Console中执行Add-Migration搭建挂起的Model变化迁移脚本。

执行get-help Add-Migration –detailed查看Add-Migration的详细用法。

-Name 指定自定义脚本的名称

-Force

-ProjectName

-StartUpProjectName

-ConfigurationTypeName 指定使用的迁移配置

-IgnoreChanges 忽略检测到挂起的model改变,创建一个空的迁移。这个选项可用来为已有的数据库启用迁移创建一个初始的,空的迁移。

-ConnectionStringName 指定使用配置文件中连接字符串的名称

-ConnectionString 指定使用的连接字符串

-ConnectionProviderName 指定连接字符串的provider名称

 本Demo中执行 

Add-Migration Add_Product_CreateDateAndUnit -ProjectName Demo.Domain

 生成的Add_Product_CreateDateAndUnit:

 

clip_image002

2.1 SQL方法

前面提到CreateDate和Unit都是必须的,像Unit是string类型的,更新到数据库默认值为空,CreateDate默认值为1900/1/1 0:00:00,如下图

clip_image003

如果需要更改CreateDate或Unit的值,可以在Up()中使用Sql方法:

clip_image005

注:更新脚本时,将Unit设为中文,记得加’N’,否则在LocalDB中更新的内容会变成’?’,在SQL Server 2008 R2中没有,无论用什么数据库加上都是一个好习惯!

2.2 IgnoreChanges的使用

如果要映射现有的数据库,可以执行Add-Migration Initial,然后执行 Update-Database

这样就创建了一个初始的迁移。在这个基础上再修改Demo,然后迁移。

3. Update-Database

在Package Manager Console中执行Update-Database将挂起的迁移更新到数据库。

执行get-help Update-Database -detailed查看Add-Migration的详细用法。

-SourceMigration 只有-Script打开时才有效。指定迁移的名称用作更新的起点。忽略则使用最后一次应用的迁移。

-TargetMigration 指定将数据库更新到哪个迁移的名称。

-Script 生成SQL脚本

-Force

-ProjectName

-StartProjectName

- ConfigurationTypeName

-ConnectionStringName 指定使用配置文件中连接字符串的名称

-ConnectionString 指定使用的连接字符串

-ConnectionProviderName 指定连接字符串的provider名称

本Demo中执行

Update-Database -ProjectName Demo.Domain

clip_image006

3.1 迁移到特定版本

上面提到可以使用-TargetMigration开关将数据库迁移到特定的状态。比如,撤销数据库新添加的CreateDate和Unit字段。执行

Update-Database -ProjectName Demo.Domain -TargetMigration:InitialCreate

如果要一直回滚到空数据库,可以使用 Update-Database –TargetMigration:0或-TargetMigration:$InitialDatabase命令。

3.2 生成SQL脚本

生成SQL脚本要使用-Script开关,另外两个比较重要的开关是:-SourceMigration和-TargetMigration。

比如我们要生成InitialCreate到 Add_Product_CreateDateAndUnit的迁移SQL脚本,则执行如下命令:

Update-Database -ProjectName Demo.Domain -Script -SourceMigration:InitialCreate -TargetMigration:Add_Product_CreateDateAndUnit

生成下面的SQL脚本

clip_image008

如果忽略-SourceMigration开关,则使用最后一次应用的迁移作为起点,忽略-TargetMigration,则使用最新迁移作为终点。

4. 应用程序启动时自动升级

通过注册 MigrateDatabaseToLatestVersion 数据库初始值设定项来实现该功能。数据库初始值设定项只是包含用于确保数据库安装正确的某种逻辑。首次在应用程序进程 (AppDomain) 中使用上下文时,将运行此逻辑。

Demo中执行

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

其中Configuration生成的是internal sealed class,不在一个程序集中需要修改成public

三、使用Migrate.exe迁移

将命令行工具migrate.exe复制到包含迁移配置的程序集位置,可以在VS外部进行迁移操作。

在使用 NuGet 安装实体框架时,migrate.exe 位于下载包的 tools 文件夹中。在 <项目文件夹>\packages\EntityFramework.<版本>\tools 中

有了 migrate.exe 之后,需要将其复制到包含迁移的程序集位置。

如果应用程序面向 .NET 4 而不是 4.5,则还需要将 Redirect.config 复制到这个位置,并将其重命名为 migrate.exe.config。这样,migrate.exe 会让正确的绑定重定向能够找到实体框架程序集。

clip_image009clip_image010

注意:migrate.exe 目前不支持 x64 程序集。

Migrate.exe的使用

migrate.exe /? 显示帮助信息

migrate assembly [configurationType] [/targetMigration]

[/startUpDirectory] [/startUpConfigurationFile]

[/startUpDataDirectory] [/connectionStringName]

[/connectionString] [/connectionProviderName] [/force] [/verbose]

[/?]

Assembly 指定包含迁移配置类型的程序集

[configurationType] 指定迁移配置类型的名称

[connectionProviderName] 指定连接字符的provider

[connectionString] 指定使用的连接字符串

[connectionStringName] 指定配置文件中使用的连接字符串名称

[force] 表示允许自动迁移引起数据丢失

[startUpConfigurationFile] 指定程序的Web.config或App.config

[startUpDataDirectory] 指定当解析包含|DataDirectory|的连接字符串时使用的目录

[targetMigration] 指定迁移到的版本

[verbose] 指定输出执行的SQL和其他信息到控制台

本Demo中执行

migrate Demo.Domain.dll /startUpConfigurationFile="MigrationsDemo.exe.config" /targetMigration=” Add_Product_CreateDateAndUnit” /verbose

四、参考文章

Code First 迁移

自动化 Code First 迁移

migrate.exe

五、Demo

clip_image012

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【迁移】—Entity Framework实例详解 的相关文章

随机推荐

  • 从点击Button到弹出一个MessageBox, 背后发生了什么

    思考一个最简单的程序行为 xff1a 我们的Dialog上有一个Button xff0c 当用户用鼠标点击这个Button时 xff0c 我们弹出一个MessageBox 这个看似简单的行为 xff0c 谁能说清楚它是如何运行起来的 xff
  • Windows 7 封装篇(一)【母盘定制】[手动制作]定制合适的系统母盘

    Windows 7 封装篇 xff08 一 xff09 母盘定制 手动制作 定制合适的系统母盘 http www win10u com article html 10 html Windows 7 封装篇 xff08 一 xff09 母盘定
  • #ifdef __cplusplus 倒底是什么意思?

    时常在cpp的代码之中看到这样的代码 ifdef cplusplus extern 34 C 34 endif 一段代码 ifdef cplusplus endif 这样的代码到底是什么意思呢 xff1f 首先 xff0c cplusplu
  • ping过程详细解读

    0 前言 在讲解ping过程之前 xff0c 我们需要了解以下概念 1 何为ping PING Packet Internet Groper xff0c 因特网包探索器 xff0c 用于测试网络连通性的程序 Ping发送一个ICMP Int
  • 使用源码安装MariaDB

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 系统 xff1a CentOS 6 5 x86 64 为什么源码安装 xff1f 自定义编译参数 xff0c 编译器优化 xff0c 自定义安装位置 源码安装系统需求 xf
  • VS2015配置Linux开发远程调试

    VS2015配置Linux开发远程调试 简介 vs2015支持跨平台开发 软件环境 VS2015 update3 Visual C 43 43 for Linux Development VC Linux exe 安装步骤 安装VS2015
  • 将linux文件中的tab更换为空格的三种方法

    将linux文件中的tab更换为空格的三种方法 1 xff0c 用sed命令 sed s t g filename gt filename1 2 用tr命令 cat filename tr 34 t 34 34 34 gt filename
  • React生命周期-踩坑记_10

    React生命周期 生命周期概览 生命周期的状态 组件的生命周期可分成三个状态 xff1a Mounting xff1a 已插入真实 DOMUpdating xff1a 正在被重新渲Unmounting xff1a 已移出真实 DOMcom
  • 转录组入门(5): 序列比对

    欢迎来GitHub上fork xff0c 一起进步 xff1a https github com xuzhougeng 比对软件很多 xff0c 首先大家去收集一下 xff0c 因为我们是带大家入门 xff0c 请统一用hisat2 xff
  • amavisd 规则备忘

    邮件服务器在做内容过滤 xff0c 结果误杀好多邮件 xff0c 有一些常用规则再现 xff0c 记录一下 20150113 初版 amavisd 版本为2 6 4 https wiki apache org spamassassin Ru
  • TensorFlow Lite 支持移动 GPU,速度推测提升4-6倍

    最近 xff0c 开源机器学习框架 TensorFlow Lite 更新 xff0c 新版更新支持了 GPU 支持 GPU 原因 虽然移动设备的处理能力和功率都有限 虽然 TensorFlow Lite 提供了不少的加速途径 xff0c 比
  • Linux开机启动顺序简述

    Linux的开机启动顺序 第一步 xff1a 当然是加电了 第二步 xff1a 加载BIOS设置 xff0c 选择启动盘 这是因为因为BIOS中包含了CPU的相关信息 设备启动顺序信息 硬盘信息 内存信息 时钟信息 PnP特性等等 在此之后
  • IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

    关于 OAuth 2 0 的相关内容 xff0c 点击查看 xff1a ASP NET WebApi OWIN 实现 OAuth 2 0 OpenID 是一个去中心化的网上身份认证系统 对于支持 OpenID 的网站 xff0c 用户不需要
  • 使用MakeSureDirectoryPathExists 创建多级目录

    The MakeSureDirectoryPathExists function creates all the directories in the specified DirPath beginning with the root BO
  • gnome桌面显示计算机,使用 GNOME 桌面

    Fedora 12 默认使用 GNOME 作为窗口管理器 Window Manager xff0c GNOME 的目标是基于自由软件 xff0c 为 Unix 或者类 Unix 操作系统构造一个功能完善 操作简单以及界面友好的桌面环境 xf
  • jQuery匹配各种条件的选择器用法

    hidden 匹配所有的不可见元素 xff0c input 元素的 type 属性为 34 hidden 34 的话也会被匹配到 Matches all elements that are hidden or input elements
  • 加ing形式的单词有哪些_利用英语原版教材轻松记单词快乐学语法

    英语中 xff0c 不定冠词有a和an两种形式 区别在an多了一个辅音字母n xff0c 其作用是在元音之间起分隔作用 强烈建议家长和小朋友一起重点学习英语中的五个元音并牢记相应的音标 很多朋友发音不好 xff0c 重要原因是元音不到位 x
  • linux 批量登录脚本,批量登陆linux主机脚本

    test sh bin bash dir 61 home test while read line do host 61 96 echo line awk print 1 96 passwd 61 96 echo line awk prin
  • Lottie - 轻松实现复杂的动画效果

    1 Lottie 介绍 Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案 xff0c 设计师可以使用 Adobe After Effects 设计出漂亮的动画之后 xff0c 使用 Lottic 提供的 Bodymo
  • 【迁移】—Entity Framework实例详解

    好久没有在博客园更新博客了 xff0c 如今都换了新公司 前段时间写了关于EF迁移的文档 xff0c 今天拿出来作为这个系列的一篇吧 一 Entity Framework 迁移命令 xff08 get help EntityFramewor