2

我有一个使用引用类库的主要 Web 应用程序项目,该类库首先使用 EF 代码。在主 Web 应用程序中,我还有几个 .edmx 文件。这是一个使用自动迁移 (MigrateDatabaseToLatestVersion) 的具有真实数据的生产应用程序。

我刚刚从 EF 5 升级到 EF 6。升级之间根本没有类/上下文更改。我只是升级并修复了我的 .edmx 文件。没有编译时错误。然而,当我尝试我的主应用程序时,我收到以下错误:

找不到对象“dbo.FormItemResponseFormItemAnswers”,因为它不存在或您没有权限。

现在我已经仔细检查了我的数据库,并且该表应该并且确实存在,并且用于连接的登录名具有数据库的 dbo 权限,就像升级前一样。所以我不知道为什么我会收到这个错误。没有改变。堆栈跟踪如下所示:

[SqlException(0x80131904):找不到对象“dbo.FormItemResponseFormItemAnswers”,因为它不存在或您没有权限。] System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔中断连接,操作1 wrapCloseInAction) +1767866 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) +5352418 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet stateOjbjHandler, TdsParser , Boolean& dataReady) +1691 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) +869 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +410 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +160 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext1 c) +36 System.Data。 Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch(TTarget target, Func3 操作,TInterceptionContext,interceptionContext,Action3 executing, Action3 已执行)+138 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand 命令,DbCommandInterceptionContext 拦截上下文)+476 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() +177 System.Data.Entity.Migrations。 DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext) +307 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext) +59 System.Data.Entity.Migrations.DbMigrator。 ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) +110 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 个迁移语句,DbConnection 连接)+799 System.Data.Entity.Migrations.<>c__DisplayClass30.b__2e() +66 System.Data.Entity.SqlServer.<>c__DisplayClass1.b__0() +34 System.Data.Entity.SqlServer。 DefaultSqlExecutionStrategy.Execute(Func 1 operation) +251 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) +196 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements, DbTransaction existingTransaction) +326 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable 1 migrationStatements) +39 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) +42 System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 operations, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) +1335 System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) +1358 System.Data.Entity.Migrations.Infrastructure.MigratorBase.AutoMigrate (字符串 migrationId、VersionedModel sourceModel、VersionedModel targetModel、布尔降级)+64 System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId) +741 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId) +59 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) +888 System.Data.Entity.Migrations.<>c__DisplayClassc.b__b() +38 System.Data.Entity .Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) +516 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) +42 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +136 System. Data.Entity.Migrations.Infrastructure.MigratorBase.Update() +33 System.Data.Entity.MigrateDatabaseToLatestVersion2.InitializeDatabase(TContext context) +154 System.Data.Entity.Internal.<>c__DisplayClassf1.b__e() +165 System.Data.Entity.Internal.InternalContext.PerformInitializationAction(动作动作) +110 System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() +660 System.Data.Entity.Internal.LazyInternalContext.b__4 (InternalContext c) +31 System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) +143 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 动作) +292 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() +123 System.Data.Entity.Internal.InternalContext.Initialize() +41 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +39 System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() +137 System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext() +38 System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() +99 System.Linq.Queryable.Where(IQueryable1 源,表达式`1谓词)+63

我还没有找到其他人遇到这个问题。有人可以阐明一下吗?我不知道该怎么做,通常的谷歌显示大部分 SQL 错误与 EF 无关。

同样,上下文/对象中没有任何变化,也没有对数据库进行任何手动更改。我仔细检查了我的源代码控制。我无法从堆栈跟踪中判断它是否正在尝试运行迁移,但我使用自动迁移并且它不应该尝试迁移,因为没有任何改变。

编辑:我知道 _MigrationHistory 表中存储了 EF 版本号,我的所有版本目前都是 5.0.0.net45。是否有可能尝试为 v6 创建新的迁移历史记录?但同样,没有上下文变化我不知道它试图用那个表做什么。

4

2 回答 2

0

不应该在测试/开发之外使用自动迁移。您还应该针对类似生产的副本或克隆而不是实际的生产数据库运行升级过程。我想禁用自动迁移并强制进行正常迁移,>Add-Migration然后>Update-Database可能会解决此问题。

于 2014-05-30T17:42:14.130 回答
0

尝试删除数据库,然后重新创建

或尝试实现 System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges

于 2014-05-30T16:34:31.140 回答