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文件夹。
默认情况下是否已启用?为什么会发生迁移?
答案 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);
}