将 EF5 升级到 EF 6,现在得到“找不到对象,因为它不存在或您没有权限。”

Posted

技术标签:

【中文标题】将 EF5 升级到 EF 6,现在得到“找不到对象,因为它不存在或您没有权限。”【英文标题】:Upgraded EF5 to EF 6 and now get "Cannot find the object because it does not exist or you do not have permissions." 【发布时间】:2014-07-20 11:03:31 【问题描述】:

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

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

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

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

[SqlException (0x80131904): 找不到对象“dbo.FormItemResponseFormItemAnswers”,因为它不存在或您没有权限。] System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,Action1 wrapCloseInAction) +1767866 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)+5352418 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用者HasConnectionLock,布尔异步关闭)+244 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1691 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名,布尔异步,Int32 超时,布尔异步写入)+869 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 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.InternalDispatcher1.Dispatch(TTarget target, Func3 操作,TInterceptionContext 拦截上下文,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 migrationStatements,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(Func1 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(IEnumerable1 migrationStatements) +39 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements)+42 System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(字符串 migrationId,XDocument targetModel,IEnumerable1 operations, IEnumerable1 systemOperations,布尔降级,布尔自动)+1335 System.Data.Entity.Migrations.DbMigrator.AutoMigrate(字符串 migrationId,VersionedModel sourceModel,VersionedModel targetModel,布尔降级)+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(操作 mustSucceedToKeepDatabase)+516 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase)+42 System.Data.Entity.Migrations.DbMigrator.Update(字符串 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.RetryAction1.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.InternalSet1.Initialize() +137 System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext() +38 System.Data.Entity.Infrastructure.DbQuery1.System.Linq.IQueryable.get_Provider() +99 System.Linq.Queryable.Where(IQueryable1 源,表达式`1 谓词)+63

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

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

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

【问题讨论】:

【参考方案1】:

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

或尝试实施 System.Data.Entity.Database.SetInitializer(新 System.Data.Entity.DropCreateDatabaseIfModelChanges

【讨论】:

是的,这不可能,这是一个生产数据库,其中真实数据用于实时网络应用程序。 对不起,我不知道。同样,您可以执行迁移。 weblogs.asp.net/fredriknormen/using-entity-framework-4-3-database-migration-for-any-project【参考方案2】:

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

【讨论】:

以上是关于将 EF5 升级到 EF 6,现在得到“找不到对象,因为它不存在或您没有权限。”的主要内容,如果未能解决你的问题,请参考以下文章

rxjs 将 5 升级到 6。找不到“对象”类型的不同支持对象“”

无法使用EF5和VS 2010加载文件或程序集“Microsoft.SqlServer.Types”

部署到 IIS8 时 EF 6 与 EF 5 的相对性能问题

使用 EF5 Linq to Entities 作为 DAL 到 BLL 到 ObjectDataSource

实体框架 6 alpha 2 - 异步模式

如何从 NuGet 安装 EntityFramework 5.0(和其他旧版本)?