EF:禁用时自动迁移正在运行

Mat*_*rts 9 entity-framework database-migration entity-framework-5

我正在尝试更新构建服务器上的数据库,但它失败了,因为它正在尝试运行自动迁移,即使它们已被禁用.数据库已经存在,我只需要应用最新的迁移.这是我的背景:

public sealed class Configuration : DbMigrationsConfiguration<CableSenseInstanceConfiguratorContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我手动创建了一堆迁移文件,这是最新的:

public partial class Settings : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.MasterInstances", "Settings", c => c.String());
    }

    public override void Down()
    {
        DropColumn("dbo.MasterInstances", "Settings");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我然后从包管理器控制台手动更新数据库,我看到它尝试运行自动迁移(由于该表已存在而失败):

Applying code-based migrations: [201204200805145_NoMoreCerts, 201210311451543_SuperUsers, 201301041036414_Settings, 201301041128583_Settings2].
Applying code-based migration: 201204200805145_NoMoreCerts.
Applying automatic migration: 201204200805145_NoMoreCerts_AutomaticMigration.
Run Code Online (Sandbox Code Playgroud)

我的__MigrationHistory表只有初始创建的一个条目.如何阻止它进行自动迁移?

Ben*_*man 6

在这里查看jjslagace的答案:

即使禁用了自动迁移,Update-Database也会尝试执行自动迁移

您正在手动构建迁移.我的猜测是实体框架想要在迁移脚本中添加一些你没有的东西,或者它想要以不同的方式命名列等等.EF有一个大脑,那个大脑很简单.除非你用流利的方式告诉它(不是通过手动创建/调整迁移文件),否则它会以某种方式表达.从上面问题的答案来看,听起来有时会导致您看到的问题.

长话短说不要手动构建迁移文件.而是运行add-migrations命令.这将为您创建迁移,您可以看到EF在应用于您的数据库之前期望做什么(因为有时它是愚蠢的).如果需要覆盖EF生成的内容,可以通过重写OnModelCreating在DBContext类中添加流畅的映射.然后使用-force选项再次运行add-migration. 这是使用Fluent API来优化EF映射的一个很好的参考.冲洗并重复,直到您获得正在查找的迁移,然后运行update-database.

希望有所帮助!