web-dev-qa-db-ja.com

「オブジェクト "dbo.xxxx"が存在しないか、権限がないため、オブジェクトを見つけることができません。」

私のMVC Webアプリで、既存のモデルにCompetenciesと呼ばれるモデルを追加し、add-migrationupdate-databaseを実行しましたが、正常に機能しました。そのモデルをベースにしたコントローラーであれば、問題はありませんでした。

しかしその後、何かがおかしいことに気付いたので、コントローラーとそのモデルのビューを削除しました。また、サーバーエクスプローラーからテーブルを削除し、CompetencyLabelという新しいモデルを作成してadd-migrationを実行しましたが、正常に機能しますが、update-databaseを実行すると、 PM>ウィンドウでのこのエラー:

「オブジェクト「dbo.Competencies」が存在しないか、権限がないため、見つかりません。」

そのテーブルは削除されましたが、なぜそれを求められるのかわかりません。誰かがそれを機能させる方法を知っていますか?どうもありがとう。

13
user2949042

このエラーが発生した場合は、Up()ステートメントを順番に並べてみてください。例えば、 - Before Rearrangement

上の画像を見ると、最初にUsersテーブルの名前が変更され、次の行でUsersテーブルに外部キーを削除するためのSQLステートメントが生成されます。 Entity Frameworkにとって、そのテーブル(つまりUsersテーブル)はもう存在しないため、エラーがスローされます。

Usersテーブルの名前が変更されても再度呼び出されないように、ステートメントを再配置します。下の画像に例を示します。 After Rearrangement

17
Alf Moh

_Enable-Migrations_コマンドを入力すると、Migrationsフォルダーがプロジェクトに作成されます。 _Add-Migration_を実行すると、そのフォルダーに新しい移行ファイルが作成されます。ファイルでは、2つのメソッドが定義されています。

  • Up()-_Update-Database_を使用してデータベースをアップグレードするときに実行するアクションを定義します
  • Down()-_Update-Database_を使用してデータベースをダウングレードするときに実行するアクションを定義します

コンピテンシーモデルを削除すると、最新の移行によってUp()メソッドにコードが追加され、コンピテンシーテーブルのインデックスが破棄されてテーブルが削除されます。手動で行ったので、それを担当するコードと_Update-Database_を削除します。問題なくアップグレードするはずです。

11
krzychu

この問題に対する別の答えを見つけました。

私のシナリオでは、エンティティ(変更関係とエンティティ名)を変更しました。私が実行したとき、update-database -verbose「EntityHistory」でいくつかの関数を実行していることがわかりましたが、名前を「AnotherEntityHistory」に変更したため、そのエンティティはもう存在していません。次に、「オブジェクト "dbo.EntityHistory"が存在しないか、権限がないため、オブジェクトが見つかりません」という結果になります。

私が行ったのは、AnotherEntityHistoryの名前を再度EntityHistoryに変更し、Update-databaseを実行して(「EntityHistoryが不足している」ため、すべてOKになります)、EntityHistoryの名前をAnotherEntityHistoryに再度変更して、update-databaseを再度実行しました。

テーブルの名前を変更したり、インデックスを削除したりする代わりに、テーブルの名前を変更するだけでよいことがわかります。

この方法では、テーブルや移行値を削除する必要はありません。

4
EduLopez

プロジェクトの移行をやり直しても、EFはスキーマの変更を記憶します。

プロジェクトの初期に同様の問題があり、データベースから_MigrationHistoryテーブルを削除して修正し、移行を再生成しました。

2
Wilfur Limited

Add-Migrationを適用した後、Update-Databaseを実行する前にデータベースの内容を手動で削除または変更したため(ここでエラーが生成されると思います

  • 正しく適用されていないため、対応する移行ファイルを移行フォルダから削除します。Update-Database –TargetMigration: OldMigrationを使用して以前の移行を元に戻すか、生成されたデータベースを削除するか、データベーステーブルから古い移行レコードをクリアする必要があります
  • NPMコードからの移行Add-Migrationを最初に移行する
  • Add-Migrationコマンドからデータベースの更新を実行する

これで問題が解決します。

2

migrationsフォルダーに手動で追加したすべての移行クラスを削除します(add-migrationコマンドによって)このコマンドを入力します_add-migration MigrationName -ProjectName YourProjectName_

すべてがうまくいく場合は、新しく作成された移行クラスのUpメソッドに次のコードが表示されます。

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

次に、このコマンドを実行します_update-database -verbose -ProjectName YourProjectName_

幸せなコーディング

2
Code_Worm

同様の問題がありました。この問題は、ユーザーがデータベースにテーブルを作成できない場合に発生します。これを解決するには、データベースにテーブルを作成するアクセス権をユーザーに付与する必要があります。

あなたは付け加えられます db_ddladminまたはdb_ownerデータベースデータベースユーザーのロールメンバーシップ。

1
JBA

まず、このエラーについて理由を教えてください:

移行を手動で削除し、その後それで十分だと考えますが、新しい移行では、その効果を作成することが存在します。

ソリューション:

すべての移行を1つずつ開き、dbo-xxxxを示す部分を削除します

それだけ:)

0
akbar

私の問題は、 @ EduLopezの回答 で説明されている問題に似ていました。

  1. この答えこの答え のように、手動で移行を変更しました。具体的には、(テーブルをドロップして作成するのではなく)テーブルの名前を変更したいと思いました。
  2. そして私のコードはそのようなものでした:

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

解決策:@ EduLopezが提案したように 、私はupdate-database -verboseそして、新しいスキーマ名を指定する必要があることを発見しました:

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