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

时间:2014-01-08 21:01:11

标签: asp.net-mvc

在我的MVC Web App中,我为现有模型添加了一个名为 Competencies 的模型,并add-migrationupdate-database,它工作正常,然后我已经创建了一个基于该模型的控制器,没关系。

但在那之后,我意识到出了问题,所以我用模型删除了控制器及其视图。我也从Server Explorer中删除了表,并创建了一个名为 CompetencyLabel 的新模型,然后运行add-migration,它运行正常,但是当我运行update-database时,我得到了PM中的此错误>窗口:

  

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

该表已被删除,我不知道为什么它仍然会问我。有人知道如何使它工作吗?非常感谢。

9 个答案:

答案 0 :(得分:14)

如果出现此错误,请尝试按顺序排列Up()语句。例如, Before Rearrangement

当您查看上面的图像时,您意识到,Users表在开头和下一行重命名,生成一个SQL语句以删除Users中的外键表但是对于Entity Framework,该表(即Users表)不再存在,因此会引发错误。

重新排列语句,以便在重命名Users表时,不会再次调用它。下图中显示了一个示例。 After Rearrangement

答案 1 :(得分:10)

当您输入Enable-Migrations命令时,会在项目中创建一个Migrations文件夹。只要您Add-Migration,就会在该文件夹中创建一个新的迁移文件。在文件中,定义了两种方法:

  • Up() - 定义在使用Update-Database
  • 升级数据库时要采取的操作
  • Down() - 定义在使用Update-Database降级数据库时要采取的操作

当您删除了Competencies模型时,最新的迁移将代码添加到Up()方法,该方法会销毁Competencies表中的索引并删除该表。正如您手动完成的那样,只需删除对其负责的代码Update-Database即可。它应该没有问题地升级它。

答案 2 :(得分:2)

我找到了这个问题的另一个答案。

我的情景是我在我的实体中进行了更改(更改关系和授权名称)。当我运行update-database -verbose时,我发现它正在使用" EntityHistory"运行一些函数。但是那个实体不再存在,因为我把它的名字改为" AnotherEntityHistory"。然后,结果我得到" 无法找到对象" dbo.EntityHistory"因为它不存在或您没有权限"。

我所做的是再次将AnotherEntityHistory重命名为EntityHistory,运行Update-database(一切都会好的,因为它现在有"缺少"实体EntityHistory),再次将EntityHistory重命名为AnotherEntityHistory并运行更新-database再次。

您将看到现在只需要重命名表而不是重命名表,删除索引等....

这样您就不必删除任何表或迁移值。

答案 3 :(得分:2)

在应用Add-Migration之后和执行Update-Database之前手动删除/修改了数据库内容(我猜错误是在这里生成

  • 从迁移文件夹中删除相应的迁移文件,因为它未正确应用 使用Update-Database –TargetMigration: OldMigration恢复先前的迁移或删除生成的数据库或需要清除数据库表中的旧迁移记录
  • 从NPM代码首次迁移
  • 应用迁移Add-Migration
  • Add-Migration命令
  • 执行数据库更新

这可以解决您的问题。

答案 4 :(得分:1)

删除您在Migrations文件夹中手动添加的所有迁移类(通过add-migration命令),键入此命令add-migration MigrationName -ProjectName YourProjectName

如果每件事情都正常,你应该在新创建的迁移类的Up方法中看到以下代码

DropTable("dbo.Competencies"); CreateTable("dbo.CompetencyLabel");

然后运行此命令update-database -verbose -ProjectName YourProjectName

快乐编码

答案 5 :(得分:1)

即使您重新启动了项目的迁移,EF仍会记住架构更改。

我们在项目的早期遇到了类似的问题,我们通过从数据库中删除_MigrationHistory表来修复它,然后重新生成迁移。

答案 6 :(得分:1)

我有类似的问题。 当用户无法在数据库中创建表时,会出现此问题。 为了解决这个问题,您需要授予用户访问权限以在数据库中创建表。

您可以为数据库用户添加db_ddladmindb_owner数据库角色成员。

答案 7 :(得分:0)

我的问题类似于@EduLopez' answer中描述的问题。

  1. 很像this answerthis answer,我手动修改了迁移。具体来说,我想重命名表(而不是删除并创建表)。
  2. 我的代码是这样的:

        protected override void Up(MigrationBuilder migrationBuilder)
        {    
            migrationBuilder.RenameTable(
                name: "oldTableName",
                schema: "oldSchemaName",
                newName: "newTableName"                    
            );
        }
    

解决方案::就像@EduLopez suggested一样,我运行了update-database -verbose,发现我需要指定新架构名称

        protected override void Up(MigrationBuilder migrationBuilder)
        {    
            migrationBuilder.RenameTable(
                name: "oldTableName",
                schema: "oldSchemaName",
                newName: "newTableName",
                newSchema: "newSchemaName" // added this line
            );
        }

答案 8 :(得分:0)

首先让我告诉原因此错误:

您手动删除了迁移,然后您认为足够了。但是在新迁移中,您创建的效果仍然存在。

解决方案:

一个接一个地打开所有迁移,并删除指示dbo-xxxx的部分

调整一下:)