DropCreateDatabaseIfModelChanges导致自动迁移,即使我还没有启用它们

时间:2016-02-25 20:02:58

标签: c# .net entity-framework entity-framework-6

EntityFramework 6

我试图诊断在安装后同时启动的2个单独服务使用相同上下文时发生的竞争条件。

在这两种情况下,Context都使用DropCreateDatabaseIfModelChanges初始值设定项。

当竞争条件发生时查看堆栈跟踪时,异常通过DbMigrator跟踪:

at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
 at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
 at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
 at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
 at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
 at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
 at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
 at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
 at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
 at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
 at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState)
 at System.Data.Entity.Database.Create(DatabaseExistenceState existenceState)
 at System.Data.Entity.DropCreateDatabaseIfModelChanges`1.InitializeDatabase(TContext context)

我还没有启用自动迁移,并且它没有在服务的基础项目中启用它们(没有迁移文件夹,并且没有启用自动迁移的代码参考) 。还有其他方法可以检查它们是否已启用?我知道它们正在发生,因为上下文引用的数据库有一个__MigrationHistory文件夹。

默认情况下是否已启用?为什么会发生迁移?

1 个答案:

答案 0 :(得分:0)

首先删除_MigrationHistory文件夹及其下的所有内容。如果它有_MigrationHistory表,请检查数据库,删除它。

验证AutomaticMigrationEnabled标志是否为false。如果没有设置AutomaticMigrationEnabled = false。你可以在配置类构造函数中完成它。

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    }

将数据库初始值设定项设置为null。

`Database.SetInitializer<MyDbContext>(null);`

但请确保在实例化DbContext的任何对象之前执行此操作。所以可能在Startup.cs / Global.asax等中为web设置它。或者简单地将它放在Context类的静态构造函数中。

static MyDbContext() {
    Database.SetInitializer<MyDbContext>(null);
}