"Не удается найти объект" dbo.xxxx ", так как он не существует или у вас нет прав."

В моем MVC Web App я добавил модель под названием Competencies к существующим моделям и сделал add-migration и update-database, она работала нормально, а затем я создал контроллер на основе этой модели, все было в порядке.

Но после этого я понял, что что-то не так, поэтому я удалил контроллер и его представления вместе с моделью. Я также удалил таблицу из обозревателя серверов, создал новую модель CompetencyLabel и запустил add-migration, она работает нормально, но когда я запускаю update-database, я получаю эту ошибку в окне PM>:

"Не удается найти объект" dbo.Competencies ", так как он не существует или у вас нет разрешений".

Эта таблица была удалена, и я не знаю, почему она до сих пор спрашивает меня об этом. Кто-нибудь знает, как заставить это работать? большое спасибо.

Ответ 1

Когда вы получите эту ошибку, попробуйте упорядочить операторы Up() по порядку. Например, Before Rearrangement

Когда вы посмотрите на изображение выше, вы поймете, что таблица Users переименовывается в начале и на следующей строке, генерируется SQL-оператор для удаления внешнего ключа в таблице Users но в Entity Framework, в эту таблицу (то есть таблица Users) больше не существует, поэтому она выдаст ошибку.

Переставьте операторы так, чтобы при переименовании таблицы Users она не вызывалась снова. Пример показан на изображении ниже. After Rearrangement

Ответ 2

Когда вы вводите команду Enable-Migrations, в проекте создается папка Migrations. Всякий раз, когда вы Add-Migration, в этой папке создается новый файл миграции. В файле определены два метода:

  • Up() - определяет действия, которые необходимо предпринять, когда мы обновляем базу данных с помощью Update-Database
  • Down() - определяет действия, которые необходимо предпринять, когда мы понижаем базу данных с помощью Update-Database

Когда вы удалили модель компетенций, последний добавленный код добавлен в метод Up(), который разрушает таблицу индексов в таблице Competencies и отбрасывает таблицу. Как вы это сделали, просто удалите код, ответственный за него, и Update-Database. Он должен обновить его без проблем.

Ответ 3

Я нашел другой ответ на эту проблему.

Мой сценарий состоял в том, что я внес изменения в свои сущности (изменил отношения и назначил имена). Когда я запустил update-database -verbose я обнаружил, что она запускает некоторые функции с "EntityHistory", но эта сущность больше не существует, потому что я изменила имя ее на "AnotherEntityHistory". Затем в результате я получаю "Не удается найти объект" dbo.EntityHistory ", потому что он не существует или у вас нет разрешений".

Я снова переименовал AnotherEntityHistory в EntityHistory, запустил Update-базу данных (все будет хорошо, потому что теперь у него есть "отсутствующая" сущность EntityHistory), снова переименовал EntityHistory в AnotherEntityHistory и снова запустил update-database.

Вы увидите, что теперь нужно только переименовать таблицу, а не переименовывать таблицы, удалять индексы и т.д.

Таким образом, вам не нужно удалять какие-либо таблицы или значения миграции.

Ответ 4

Поскольку вы удалили/модифицировали содержимое базы данных вручную после применения Add-Migration и до создания Update-Database (думаю, здесь генерируется ошибка)

  • Удалите соответствующий файл миграции из папки миграции, так как он не применяется правильно. Верните предыдущую миграцию с помощью Update-Database –TargetMigration: OldMigration или удалите сгенерированный db или нужно удалить старую запись миграции из таблицы базы данных.
  • Применить миграцию Add-Migration из первой миграции кода NPM
  • Выполните обновление базы данных из команды Add-Migration

Это устраняет вашу проблему.

Ответ 5

удалите все классы миграции, добавленные вручную в папку Migrations (командой add-migration) введите эту команду add-migration MigrationName -ProjectName YourProjectName

если все работает нормально, вы должны увидеть следующий код в методе Up нового класса миграции

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

затем запустите эту команду update-database -verbose -ProjectName YourProjectName

счастливое кодирование

Ответ 6

Даже если вы переделали миграцию своего проекта, EF все равно будет помнить о изменениях схемы.

У нас была аналогичная проблема на раннем этапе проекта, и мы исправили ее, удалив таблицу _MigrationHistory из базы данных, а затем восстановили миграцию.

Ответ 7

Моя проблема была похожа на проблему, описанную в ответе @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
            );
        }