实体框架DbContext初始化程序不在Azure WebJob

时间:2015-12-10 22:30:56

标签: entity-framework azure azure-webjobs azure-sql-database

我有一个Azure MVC Web应用程序和使用Code First / Entity Framework 6的相应WebJob。我的数据库首先在add-migration / update-database进程中在本地创建(localdb)。一切都被创建得很好,种子方法填充了一堆预设数据,应用运行正常。然后,我从VS 2015将Web App发布到Azure,并使用SQL Management Studio中的“将数据库部署到Windows Azure数据库”选项手动将数据库部署到Azure。数据库部署和Web应用程序在Azure上运行没有任何问题。

触发WebJob时会出现问题(通过QueueTrigger)。 WebJob也使用EF和它自己的DbContext实例(由于WebJob并行性和EF不是线程安全的,我在我的WebJOb方法中有一个using语句来在每次调用时实例化DbContext)。注意,我的DbContext设置了一个“null”初始化器(“Database.SetInitializer(null);”)。我想这可以防止我遇到的确切问题。

当WebJob启动时,它似乎尝试运行迁移。我得到的第一个错误是System.Data.SqlClient.SqlException: Database '<MyDbName>' already exists. Choose a different database name.这意味着它试图在不应该创建数据库时进行创建。

然后我尝试删除__MigrationHistory表的内容以尝试停止任何迁移触发器,但是出现此错误:System.NotSupportedException: Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.

无论我尝试什么,WebJob都不会成功,看起来这是因为我没有尊重我的null DbInitializer,但我不确定。网络应用程序方面从来没有问题。

值得注意的是,本地运行时问题不存在。如果我在VS下以调试模式启动WebJob,它运行完美并且有问题地访问我的数据库的localdb版本。该问题仅存在于“实时”Azure中。

更新

从Azure查看WebJob的详细错误日志时,尽管我付出了最大的努力,但该作业似乎正在触发迁移尝试:

   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action1 act)
   at System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action1 act)
   at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable1 commandTimeout, DbConnection sqlConnection, String createDatabaseScript)
   at System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable1 commandTimeout, StoreItemCollection storeItemCollection)
   at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable1 commandTimeout, StoreItemCollection storeItemCollection)
   at System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase()
   at System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection connection)
   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, Func3 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.DropCreateDatabaseIfModelChanges1.InitializeDatabase(TContext context)
   at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.<CreateInitializationAction>b__e()
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
   at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
   at System.Data.Entity.Internal.RetryAction1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet1.FindAsync(CancellationToken cancellationToken, Object[] keyValues)
   at System.Data.Entity.DbSet1.FindAsync(CancellationToken cancellationToken, Object[] keyValues)
   at System.Data.Entity.DbSet1.FindAsync(Object[] keyValues)
   at Repository.Pattern.Ef6.Repository1.<FindAsync>d__19.MoveNext()

对InitializeDatabase和DropCreateDatabaseIfModelChanges1的调用似乎很清楚,我的null SetInitilizer在Azure上运行时没有预期的效果。我很难过。

0 个答案:

没有答案