• Code First Migrations


    在MVC开发当中难免会对类进行修改,修改后再次运行就会出现异常,提示上下文的模型已在数据库创建后发生改变。

    支持“AppContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

     如果是项目初期开发倒是好办,可以删掉数据库重新建立,但是如果项目已经运行了,我想你不会想初期那样做吧,会照成数据丢失的。这个时候就需要使用EF的数据迁移功能了,下面教你如何使用数据迁移。

    启用迁移

    打开VS,工具>库程序包管理器>程序包管理器控制台。

    在控制台中输入Enable-Migrations(不分大小写),如下图所示

     输入这个命令后还会在项目中创建Migrations文件夹,里面包含两个文件

    • Configuration.cs  这个类允许你自己配置对AppContext上下文迁移的行为。比如添加一些数据的初始化操作,例如:
      context.Blogs.AddOrUpdate(
                      p => p.Title,
                      new Blog { Title = "测试标题1", Content = "内容1" },
                      new Blog { Title = "测试标题2", Content = "内容2" }
                  );
    • 201403310555286_InitialCreate.cs,这个文件名是由 时间戳+下划线+ Initial.cs组成的,这个类包含了创建数据库架构的代码。

    生成和运行迁移

    Code First的数据迁移有两个命令:

    • Add-Migration      对比当前数据库和模型的差异,生成相应的代码,使数据库和模型匹配的。
    • Update-Database  将任何挂起的迁移到数据库。

    在控制台中输入Add-Migration AddBlogCreate,回车运行.

    AddBlogCreate 是可以随意取的,是EF进行数据迁移的一个标识,为了更好知道这次迁移是干什么的最好取有意义的名称。命令运行完后,打开新添加的201403310649014_AddBlogCreate类,在Up方法里面可以看到添加新列的代码。

    public partial class AddBlogCreate : DbMigration
        {
            public override void Up()
            {
                AddColumn("dbo.Blogs", "CreateTime", c => c.DateTime(nullable: false));
            }
            
            public override void Down()
            {
                DropColumn("dbo.Blogs", "CreateTime");
            }
        }

     在程序包管理器控制台运行Update-Database 提交到数据库,在数据库中你将会看到新增的CreateTime列.而且在Configuration类中的send方法也会执行。

     迁移到一个特定的版本(包括降级)

     在程序包管理器控制台中运行Update-Database –TargetMigration: AddBlogCreate,数据库将还原到新增CreateTime属性的时候。

     启用自动迁移

     如果你想你部署的应用程序在启动的时候自动升级数据库,你可以通过注册数据库初始化MigrateDatabaseToLatestVersion做到这一点。

     将Configuration构造函数的设置为:AutomaticMigrationsEnabled=true,AutomaticMigrationDataLossAllowed=true.

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

     在Global.asax的 Application_Start 方法中添加以下代码:

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

    参考:

    http://msdn.microsoft.com/en-us/data/jj591621

  • 相关阅读:
    通过网络方式安装linux的五种方法
    谈FTP服务器攻击技术及其展望 (下)
    谈FTP服务器攻击技术及其展望 (修改中)
    Fedora 14 x64 试用手记
    加固Samba安全三法
    VMWare高可用集群在企业的应用
    Leetcode-1008 Construct Binary Search Tree from Preorder Traversal(先序遍历构造二叉树)
    Leetcode-1006 Clumsy Factorial(笨阶乘)
    Leetcode-1007 Minimum Domino Rotations For Equal Row(行相等的最少多米诺旋转)
    Leetcode-1005 Maximize Sum Of Array After K Negations(K 次取反后最大化的数组和)
  • 原文地址:https://www.cnblogs.com/wubh/p/3635828.html
Copyright © 2020-2023  润新知