如何重新创建迁移脚本

时间:2016-05-30 18:15:17

标签: entity-framework entity-framework-6 ef-migrations

我试过如下:

  1. 删除了Migrations文件夹中与模型相关的所有生成脚本。

  2. 删除了__MigrationHistory表格中与模型相关的所有条目。

  3. 但是当我跑步时它会像这样产生:

    PM> Add-Migration "Added_Investors_Table"
    

    生成的迁移脚本

     public partial class Added_Investors_Table : DbMigration
        {
            public override void Up()
            {
    
            }
    
            public override void Down()
            {
    
            }
        }
    

    模型

        [Table("Investors")]
        public class Investor : FullAuditedEntity
        {
    
            public virtual int AmountCommitted { get; set; }
    
            public virtual decimal PercentageOfDeal { get; set; }
    
            public virtual decimal AmountSpentToDate { get; set; }
    }
    

    DbContext.cs

    public class IpDbContext : AbpZeroDbContext<Tenant, Role, User>
        {
            /* Define an IDbSet for each entity of the application */
    
            public virtual IDbSet<Investor> Investors { get; set; }
    
            public IpDbContext() : base("Default")
            {
    
            }
       }
    

    您知道为什么它不会像往常一样重新创建迁移脚本吗?除了上面提到的两个地方之外,我应该删除这个模型吗?

    注意:上面提到的表是新的。我第一次成功创建了脚本。但是由于一些变化等等。我需要重新创建它。但它不起作用。但是,如果我更改现有模型,那么它会给出更改集脚本。很奇怪没有?我不知道问题出在哪里..

1 个答案:

答案 0 :(得分:2)

我假设您不介意重新创建Investor实体和相应的表格,但您不想修改任何其他内容。如果是这样,我认为你可以仔细,尝试以下方法:

  1. 备份您的数据库(无论如何使用prod副本或开发数据库)
  2. 将以前的迁移脚本还原回Migrations文件夹
  3. 恢复__MigrationHistoryTable
  4. 保留迁移脚本类,但删除与Investor实体相关的DDL代码(例如,如果您要迁移以添加Investor,则up和{{1}对于该迁移,方法应为空)
  5. down中删除Investor实体及其配置,并使用DbContext开关生成新的迁移。假设此迁移称为 RemoveInvestorMigration 。由于-IgnoreChanges开关
  6. ,此方法也应采用空updown方法
  7. 通过-IgnoreChanges RemoveInvestorMigration 迁移应用到您的(开发)数据库。 现在EF认为你删除了Update-Database实体(而且你做了某种方式)
  8. Investor实体及其配置恢复为Investor再次
  9. 生成新的迁移。我们称之为 RestoreInvestorMigration 。这个应该生成创建DbContext实体的正确updown方法。您必须在此处拥有一些Investor代码,否则会出现问题
  10. 应用 RestoreInvestorMigration ,您已完成
  11. 诀窍是让EF相信,但你必须要小心,因为它会相信

    顺便说一下,只要您需要它,就可以使用CreateTable开关运行Update-Database,这样EF就会显示生成的SQL代码,以便在应用迁移后更新数据库。这不会应用迁移(即它不会执行SQL代码)。这样,您可以看到EF在您选择应用迁移时会做什么