使用Code First的话对于实体字段或者表映射修改都需要使用迁移操作,下面列出操作具体步骤

1、创建映射类和实体,本文主要是讲解迁移步骤,其他代码则没有列出

     public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
ToTable("Product"); //指定表明
HasKey(p => p.Id); //指定主键
}
}
     public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}

2、假设现在Product类Name要设置为非空和最大长度为200

     public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
ToTable("Product"); //指定表明
HasKey(p => p.Id); //指定主键
Property(p => p.Name).IsRequired().HasMaxLength();
}
}

如果运行程序则会报错

具体操作

启用迁移需要在VS的程序包管理控制台输入命令来完成,如果有多个项目,记得选择对应项目

命令:Enable-Migrations

输入命令后会创建一个文件夹Migrations其中有个Configuration文件

     internal sealed class Configuration : DbMigrationsConfiguration<MigrationOpt.Models.EntityContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
ContextKey = "MigrationOpt.Models.EntityContext";
} protected override void Seed(MigrationOpt.Models.EntityContext context)
{ }
}

AutomaticMigrationsEnabled设置为true表示自动迁移,为false则需要手动迁移

Seed方法是在迁移过程数据库Schema成功应用以后执行的操作,可以利用这个方法添加一些初始化数据:

 protected override void Seed(SchoolContext context)
{
context.Set<Student>().AddOrUpdate(
p => p.StudentName,
new Student { StudentName = "张三" },
new Student { StudentName = "李四" },
new Student { StudentName = "王五" }
);
}

1、自动迁移

如果需要使用自动迁移的话,除了设置AutomaticMigrationsEnabled设置为true,还需要在DbContext构造函数中写上这句

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EntityContext, Configuration>("DBConnectionString"));

例如:

         public EntityContext()
: base("name=DBConnectionString")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EntityContext, Configuration>("DBConnectionString"));
}

2、手动迁移

如果不喜欢自动迁移,可以手工完成这个操作。手工迁移的好处后,可以随时退回到某个指定的迁移版本。迁移文件也可以进行版本管理有利于团队开发。

首先把Configuration构造函数中AutomaticMigrationsEnabled置为false,表示不使用自动迁移。

手动迁移的操作也是在程序包管理控制台使用PowerShell来完成,在每次更改实体或映射配置后,我们运行下面这个命令来生成一个迁移文件:

Add-Migration ChangeSet1

Add-Migration是固定的,空格后面的ChangeSet1是别名,可以自定义

输入命令后会生成一个迁移文件,代码:

     public partial class ChangeSet1 : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Product", "Name", c => c.String(nullable: false, maxLength: ));
} public override void Down()
{
AlterColumn("dbo.Product", "Name", c => c.String());
}
}

成功生成迁移文件后,运行 Update-Database 命令,EF就开始执行迁移操作,并把数据库更新到最新的迁移文件对应的版本。

这条命令有几个常用的参数,可以查看迁移在数据库中执行的详细操作(SQL等)

Update-Database -Verbose

这个参数可以指定目标迁移版本,对于需要退回到指定版本的情况很有用(回滚)

Update-Database -TargetMigration ChangeSet1

EntityFramework之迁移操作(五)的更多相关文章

  1. EntityFramework Core迁移时出现数据库已存在对象问题解决方案

    前言 刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容. EntityFramework Core迁移出现对象在数据库中已存 ...

  2. Redis Cluster高可用集群在线迁移操作记录【转】

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  3. ubuntu16.04下Hyperledger之搭建Fabric环境简单操作(五步启动e2e_cli)

    如果你已经安装好go等工具.git及checkout相关代及下载相关镜像,您只需下面5步就能up e2e_cli~/go/src/github.com/hyperledger/fabric$ sudo ...

  4. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  5. EF 迁移操作

    一. 模型设计 1.  遵循EF标准,注意表关系配对 2.  数据模型里尽量把必须的属性和说明都写全 3.  EF默认id字段为主键,如果没有,需指定主键 二. 数据迁移 1.  命令运行环境:vis ...

  6. GIS基础软件及操作(五)

    原文 GIS基础软件及操作(五) 练习五.空间分析的基本操作 空间分析的基本操作 空间分析模块 空间分析是基于地理对象的位置和形态的空间数据的分析技术,其目的在于提取和传输空间信息.空间分析是地理信息 ...

  7. redis键的迁移操作

    1.redis单个实例内多库间的数据迁移操作 命令名称:move 语法:move key db 功能:将当前数据库的key移动到给定的数据库db当中.如果当前数据库(源数据库)和给定数据库(目标数据库 ...

  8. Docker的镜像理解以及容器的备份、恢复和迁移操作

    Docker的镜像理解以及容器的备份.恢复和迁移操作 这篇文章主要介绍了Docker的镜像理解以及容器的备份.恢复和迁移操作,覆盖很多原理知识以及容器的重要操作步骤,极力推荐!需要的朋友可以参考下 D ...

  9. EntityFramework之Log(五)

    关于日志 属性日志 DbContext.Database.Log 属性被设置为一个委托,该委托能接受带有一个字符串参数的任何方法,最主要的是,通过设置它到 TextWriter 的 Write 方法将 ...

随机推荐

  1. linux运维笔记

    一.查找大文件 sudo find / -size +100M -exec ls -lh {} \;

  2. [转]unity之LOD

    LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型. 它的好处是可以在适当的时候大量减少需要绘制的顶点数目. 它的缺点 ...

  3. Day2 Activity生命周期/启动模式/最佳实践

    Android是使用任务(Task)来管理活动的,这个栈被称作返回栈(Back Stack). Activity类中定义了7个回调方法: onCreate().在活动第一次被创建时调用,应该在这个方法 ...

  4. Python——数据类型之str

    本篇主要内容: 1.str元素的访问 2.str内置43个方法使用示例 str就是储存各种东西的字符串. 他的方法也是最多的...有各种各样的神奇魔法. 1.str的访问,str可以想列表那样访问每一 ...

  5. oom 和 jvm crash的问题

    很多次生产环境jvm进程无故消失的时候都留下了hs_err[pid].log文件  然后通过mat分析大多数情况是oom导致的  所以以前一直认为OOM一定会导致jvm crash  也就是说java ...

  6. 个人支付宝监控并自动获取交易记录对接系统API

    我们都知道,支付宝支付API接口只有企业才能使用,但有一部分业务,可能我们不方便使用企业收款,但又想做到自动化,那怎么办呢 于是一个支付宝交易记录自动监控软件诞生了. 支付宝都有一个收款二维码,收款提 ...

  7. 重复造轮子系列--内存池(C语言)

    这个代码是我上个公司工作项目的里面内存管理(基于伙伴算法)的一个简化又简化的版本. 因为没有内存边界检查: 因为没有内存使用统计: 因为没有考虑线程安全: 因为没有内存分配操作的具体文件位置信息: 因 ...

  8. Axure+SVN——实现多人团队开发

    最近进行考试系统重构,一个小组十几个人,这么多人要同时搞需求画原型.这样原本的合作开发工具SVN已经不能满足现在的需求了,这是就找到了一个新的方法--Axure+SVN. 在SVN服务器端建立一个空的 ...

  9. python os操作

    大家先看一下Python os模块中的部分函数 python 路径相关的函数 os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os. ...

  10. Linux运维文档之nginx

    NGINX安装配置1.检查并且安装依赖组件检查安装nginx的依赖性,nginx的模块需要第三方库的支持,检查是否安装下列库:zlib.zlib-devel.openssl.openssl-devel ...