一、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:

2.1 SQL方法

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

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

注:更新脚本时,将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

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脚本

如果忽略-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 会让正确的绑定重定向能够找到实体框架程序集。

注意: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

转自 http://www.cnblogs.com/nianming/p/3439260.html;

EntityFramework codefirst的更多相关文章

  1. EntityFramework CodeFirst SQLServer转Oracle踩坑笔记

    接着在Oracle中使用Entity Framework 6 CodeFirst这篇博文,正在将项目从SQLServer 2012转至Oracle 11g,目前为止遇到的问题在此记录下. SQL Se ...

  2. EntityFramework Code-First 简易教程(二)-------Code First约定

    Code First 约定 在前一篇中,我们已经知道了EF Code-First怎样从模型类(domain classes)中创建数据库表,下面,我们开始学习默认的Code-First约定. 什么是约 ...

  3. EntityFramework Code-First 简易教程(一)

    前言:学习了EF框架这么久,还没有好好总结一番,正好遇到一国外的网站,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢多谢.好 ...

  4. EntityFramework Code-First教程(一)

    前言:学习了EF框架这么久,还没有好好总结一番,正好遇到一国外的网站,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢多谢.好 ...

  5. 三层架构下的EntityFramework codefirst

    好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...

  6. EntityFramework Code-First—领域类配置之DataAnnotations

    本文出自:https://www.cnblogs.com/tang-tang/p/5510574.html 一.摘要 EF Code-First提供了一个可以用在领域类或其属性上的DataAnnota ...

  7. EntityFramework Code-First 简易教程(六)-------领域类配置之DataAnnotations

    EF Code-First提供了一个可以用在领域类或其属性上的DataAnnotation特性集合,DataAnnotation特性会覆盖默认的EF约定. DataAnnotation存在于两个命名空 ...

  8. EntityFramework Code-First 简易教程(九)-------一对多

    一对多(One-to-Many)关系: 下面,我们来介绍Code-First的一对多关系,比如,在一个Standard(年级)类中包含多个Student类. 如果想了解更多关于one-to-one,o ...

  9. EntityFramework Code-First 简易教程(八)-------一对一

    配置一对一(One-to-One)关系: 两个实体中,如果一个实体的一个实例与另一个实体相关,则我们就叫做一对一关系 查看如下代码: public class Student { public Stu ...

  10. EntityFramework Code-First 简易教程(七)-------领域类配置之Fluent API

    Fluent API配置: 前面我们已经了解到使用DataAnotations特性来覆写Code-First默认约定,现在我们来学习Fluent API. Fluent API是另一种配置领域类的方法 ...

随机推荐

  1. 关于Web项目的pom文件处理

    pom文件的方式需要修改的是 <packaging>war</packaging> <profiles> <profile> <id>com ...

  2. zabbix学习系列之触发器

    触发器的简介 监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值 每一个触发器 ...

  3. 2016.7.12 Table configuration with catalog null, schema public, and table globalpage did not resolve to any tables(疑)

    在eclipse中运行mybatis的generator插件时,出现如下错误提示: Generation Warnings Occured:Table configuration with catal ...

  4. 社区之星礼品开箱——感谢CSDN

    前言 尽管已经看过国内外无数的开箱.评測视频,也看过无数国内社区的各种玩具.电子产品.摄影的分享贴.自己却从未写过--摄影水平有限以及懒-- 昨天看到上图的文章,看到最后都说了应该晒晒照片.写写博客, ...

  5. 各类免费的API接口分享,无限次

    各类免费的API接口分享: 手机号码归属地API:https://www.juhe.cn/docs/api/id/11 历史上的今天API:https://www.juhe.cn/docs/api/i ...

  6. Vue 内容分发slot

    1.概述 内容分发:混合父组件的内容与子组件自己的模板. 2.单个插槽 当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身. 最初在  ...

  7. 微软Azure公有云个人用户是否能支付得起?

    个人建立自己的站点是普通"白领"的愿望.由于,我们的大脑分泌的脑汁须要排泄渠道.怎么办呢? 依据微软公有云的公开报价(Pricing),租用单核CPU.0.75GB内存,20GB硬 ...

  8. C#比較对象的相等性

    对于相等的机制全部不同,这取决于比較的是引用类型还是值类型.以下分别介绍引用类型和值类型的相等性. 1.比較引用类型的相等性 System.Object定义了三种不同的方法,来比較对象的相等性:Ref ...

  9. RF --系统关键字开发

    需求: 接收一个目录路径,自动遍历目录下以及子目录下的所有批处理(.bat) 文件并执行. 首先在..\Python27\Lib\site-packages 目录下创建 CustomLibrary 目 ...

  10. 获取input光标的x和y轴

    http://blog.csdn.net/kingwolfofsky/article/details/6586029 index.html <!DOCTYPE html> <html ...