• EF6 Code First & Auto Migration on Appharbor


    之前不小心看到EF的code first在appharbor上进行migration的时候比较麻烦,今天碰巧也要更新数据库了,顺便试试。

    modify model

    public class SiteInfo : Entity
    {
        [JsonProperty("id")]
        public string UserId { get; set; }
        [JsonProperty("sitename")]
        public string SiteName { get; set; }
        [JsonProperty("socialid")]
        public string SocialId { get; set; }
        [JsonProperty("des")]
        public string Description { get; set; }
        [JsonProperty("token")]
        public string AccessToken { get; set; }
        [JsonProperty("expires")]
        public DateTime ExpireDate { get; set; }
        [JsonProperty("refresh")]
        public string RefreshToken { get; set; }
        [JsonProperty("socialname")]
        public string SocilaName { get; set; }
    }
    

    其中,RefreshToken和SocilaName是新加的

    package manage console

    主要执行以下三个命令:

    • Enable-Migrations(此时生成了合并的基本架构)
    • Add-Migration(此时生成了具体变动的代码)
    • Update-Database(此时对数据库进行了修改,可以添加–Verbose参数观察生成的sql)
    • 具体介绍和高级技巧见MSDN官方文档,也不对过程中生成的文件作更多介绍了

    由于我的项目里有两个dbcontext,所以碰巧碰到了Enable-Migration需要添加参数的问题,一并把执行过程和出错过程复制出来给大家借鉴一下:

    PM> Enable-Migrations
    在程序集“SmartSnsPublisher.Web”中找到多个上下文类型。
    要允许“SmartSnsPublisher.Web.Models.ApplicationDbContext”的迁移,请使用 Enable-Migrations -ContextTypeName SmartSnsPublisher.Web.Models.ApplicationDbContext。
    要允许“SmartSnsPublisher.Web.Models.SiteDbContext”的迁移,请使用 Enable-Migrations -ContextTypeName SmartSnsPublisher.Web.Models.SiteDbContext。
    
    PM> Enable-Migrations -ContextTypeName SmartSnsPublisher.Web.Models.SiteDbContext
    正在检查上下文的目标是否为现有数据库...
    检测到使用数据库初始值设定项创建的数据库。已搭建与现有数据库对应的迁移“201402141543527_InitialCreate”的基架。若要改用自动迁移,请删除 Migrations 文件夹并重新运行指定了 -EnableAutomaticMigrations 参数的 Enable-Migrations。
    已为项目 SmartSnsPublisher.Web 启用 Code First 迁移。
    
    PM> Add-Migration AddSocialNameAndRefreshToken
    正在为迁移“AddSocialNameAndRefreshToken”搭建基架。
    此迁移文件的设计器代码包含当前 Code First 模型的快照。在下一次搭建迁移基架时,将使用此快照计算对模型的更改。如果对要包含在此迁移中的模型进行其他更改,则您可通过再次运行“Add-Migration AddSocialNameAndRefreshToken”重新搭建基架。
    
    PM> Update-Database
    指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
    正在应用显式迁移: [201402181429554_AddSocialNameAndRefreshToken]。
    正在应用显式迁移: 201402181429554_AddSocialNameAndRefreshToken。
    正在运行 Seed 方法。
    

    到此为止,检查数据库,新加的两列已经建好了。

    这个时候提交代码,appharbor顺利编译通过,访问网站时如愿出现了这个错误:

    The model backing the 'SiteDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

    也就是说,自动迁移并没有执行,我们需要手动编写代码,找到你的dbcontext类,添加overide如下方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    	Database.SetInitializer(new MigrateDatabaseToLatestVersion<SiteDbContext, Migrations.Configuration>());
    	base.OnModelCreating(modelBuilder);
    }
    

    其中,Configuration类就是Enable-Migration的时候生成的,请自行找到正确的命名空间。再次提交代码,发现数据库已经成功更改了。

    image

    所以,至少在EF6,在appharbor上执行migration已经是非常方便的事了。由于有migration history,所以合并后的代码也没有必要去删除了。

    image

  • 相关阅读:
    不写helloworld总觉得哪里似乎不对之javascript
    SQl中drop与truncate的区别
    对MarshalByRefObject的讲解(转自DuDu)
    “模态子窗体关闭后,父窗体也关闭”解决方案
    ENVI5.0 32位工具栏图标不显示解决办法
    HTML5的基础写法
    查询远程服务器数据
    javascript变量、作用域和内存问题
    javascript基本概念
    让应用程序具体相应权限
  • 原文地址:https://www.cnblogs.com/walkerwang/p/3555114.html
Copyright © 2020-2023  润新知