• EntityFramework之迁移操作(五)


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

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

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

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

    1     public class ProductMap : EntityTypeConfiguration<Product>
    2     {
    3         public ProductMap()
    4         {
    5             ToTable("Product"); //指定表明
    6             HasKey(p => p.Id);  //指定主键
    7             Property(p => p.Name).IsRequired().HasMaxLength(200);
    8         }
    9     }

     如果运行程序则会报错

    具体操作

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

    命令:Enable-Migrations

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

     1     internal sealed class Configuration : DbMigrationsConfiguration<MigrationOpt.Models.EntityContext>
     2     {
     3         public Configuration()
     4         {
     5             AutomaticMigrationsEnabled = false;
     6             ContextKey = "MigrationOpt.Models.EntityContext";
     7         }
     8 
     9         protected override void Seed(MigrationOpt.Models.EntityContext context)
    10         {
    11             
    12         }
    13     }

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

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

    1 protected override void Seed(SchoolContext context)
    2 {
    3     context.Set<Student>().AddOrUpdate(
    4       p => p.StudentName,
    5       new Student { StudentName = "张三" },
    6       new Student { StudentName = "李四" },
    7       new Student { StudentName = "王五" }
    8     );
    9 }

     1、自动迁移

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

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

    例如:

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

     2、手动迁移

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

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

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

    Add-Migration ChangeSet1

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

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

     1     public partial class ChangeSet1 : DbMigration
     2     {
     3         public override void Up()
     4         {
     5             AlterColumn("dbo.Product", "Name", c => c.String(nullable: false, maxLength: 200));
     6         }
     7         
     8         public override void Down()
     9         {
    10             AlterColumn("dbo.Product", "Name", c => c.String());
    11         }
    12     }

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

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

    Update-Database -Verbose

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

    Update-Database -TargetMigration ChangeSet1

  • 相关阅读:
    Kafka API: TopicMetadata
    从事件总线和消息队列说起
    Object.defineproperty实现数据和视图的联动
    css3动画-animation
    css3动画-transition
    jquery判断对象的type
    vs如何在运行iis express调试时,不开打新窗口和关闭调试时,iis express不退出
    重写Equals的方式
    Android中包名不能大写
    C# 几种常见数据结构【转】
  • 原文地址:https://www.cnblogs.com/zuqing/p/5452440.html
Copyright © 2020-2023  润新知