【问题标题】:DropCreateDatabaseIfModelChanges is causing automatic migrations even though I haven't enabled them即使我没有启用 DropCreateDatabaseIfModelChanges 也会导致自动迁移
【发布时间】:2016-02-25 20:02:58
【问题描述】:

实体框架 6

我正在尝试诊断在安装后同时启动的 2 个独立服务使用相同上下文时发生的竞争情况。

在这两种情况下,上下文都使用 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)

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

它们是否默认启用?为什么会发生迁移?

【问题讨论】:

  • 您是否确认它们未在您的 web.config 中打开?
  • 没有 web.config。它们没有在 app.config 中打开。

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


【解决方案1】:

首先删除_MigrationHistory 文件夹及其下的所有内容。还要检查你的数据库是否有_MigrationHistory 表,删除它。

验证 AutomaticMigrationEnabled 标志是否为假。如果未设置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);
}

【讨论】:

  • 不回答我的问题。我如何判断它们是否开启以及是否开启?
  • 如果你有 _MigrationHistory 文件夹和 _MigrationHistory 表,那么它就打开了。没有其他方法或命令可以知道这一点。也许您可以尝试手动运行 update-database 命令。如果未启用迁移,它将失败。为什么?如果您不是开发代码的唯一所有者,那么您知道它可能会被启用。
  • 表格本身是否没有属性可以让您知道它们已打开?
  • EF 不会查看表的数据,但会检查是否启用了配置以及是否存在 _migration 事物以触发迁移。是迁移过程使用迁移表中的数据。
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 2013-03-12
  • 2015-04-17
  • 2020-10-13
  • 2016-03-17
  • 2014-05-02
  • 2015-09-03
  • 2018-06-27
相关资源
最近更新 更多