"Не удается найти объект" dbo.xxxx ", так как он не существует или у вас нет прав."
В моем MVC Web App я добавил модель под названием Competencies к существующим моделям и сделал add-migration
и update-database
, она работала нормально, а затем я создал контроллер на основе этой модели, все было в порядке.
Но после этого я понял, что что-то не так, поэтому я удалил контроллер и его представления вместе с моделью. Я также удалил таблицу из обозревателя серверов, создал новую модель CompetencyLabel и запустил add-migration
, она работает нормально, но когда я запускаю update-database
, я получаю эту ошибку в окне PM>:
"Не удается найти объект" dbo.Competencies ", так как он не существует или у вас нет разрешений".
Эта таблица была удалена, и я не знаю, почему она до сих пор спрашивает меня об этом. Кто-нибудь знает, как заставить это работать? большое спасибо.
Ответы
Ответ 1
Когда вы получите эту ошибку, попробуйте упорядочить операторы Up()
по порядку. Например,
Когда вы посмотрите на изображение выше, вы поймете, что таблица Users
переименовывается в начале и на следующей строке, генерируется SQL-оператор для удаления внешнего ключа в таблице Users
но в Entity Framework, в эту таблицу (то есть таблица Users
) больше не существует, поэтому она выдаст ошибку.
Переставьте операторы так, чтобы при переименовании таблицы Users
она не вызывалась снова. Пример показан на изображении ниже.
Ответ 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.
- Так же, как этот ответ и этот ответ, я вручную изменил миграцию. В частности, я хотел переименовать таблицу (а не удалить и создать таблицу).
-
И мой код был таковым:
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
);
}