В первом сценарии, в котором вы изменили модель Code First, перед тем, как переходить и изменять базу данных вручную, нужно открыть консоль диспетчера пакетов (Nuget) и ввести:
update-database -verbose
За исключением - поскольку в этом случае вы удаляете столбец, он сообщит, что он собирается что-то удалить, и ничего не удалит, если вы явно не скажете, что все в порядке. Итак, вы набираете:
update-database -f -verbose
Теперь это удалит столбец, который вы имели в вашей модели. -verbose
говорит, что показывает SQL, который он запускает. Если вы боитесь просто позволить ему удалить что-то и проверить SQL перед запуском, используйте:
update-database -f -script
Это вместо этого выведет SQL в скрипт, который вы можете просмотреть, и запустите вручную самостоятельно.
В случае, если вы продолжили и удалили столбец в базе данных вручную, теперь у вас есть более сложный сценарий; таблица EdmMetadata, описанная в другом ответе, содержит хэш всей базы данных, который теперь не соответствует самой базе данных. Вы можете запустить SQL вручную, чтобы вернуть базу данных так, как ожидает Entity Framework (как это было до того, как вы вручную изменили ее, что приводит ее обратно в соответствие с хешем), проверив, что у вас было раньше и как выглядит ваша база данных в настоящее время.
Если это неосуществимо, вы сейчас находитесь в самой уродливой части Entity Framework Code First. Вам нужно удалить хеш-таблицу и перепроектировать БД в файлы кода.
Имя хеш-таблицы зависит от версии EF. В более старом EF4, о котором вы спрашивали, он называется EdmMetadata. В более новой версии EF5 она называется __MigrationHistory (в разделе Системные таблицы в вашей базе данных, если вы ищете в SQL Server Management Studio). Вам нужно будет стереть это.
Хорошей новостью на втором этапе, обратном инжиниринге БД в коде, является то, что Microsoft выпустила инструмент для бета-тестирования, который сделает это за вас.
Прохождение реинжиниринга дБ и EF Power Tools
Вы можете пропустить многие первые шаги, поскольку они просто настраивают БД и добавляют к ней какую-то ерунду, чтобы продемонстрировать, что вам нужно сделать: Обратный Инженер, дБ.
Обновление:
Можно также использовать ручную миграцию, чтобы обойти этот сценарий. Сделайте резервную копию базы данных, затем запустите:
add-migration WhateverYouWantToCallThis
Изменения в db EF Migrations, которые необходимо выполнить, появятся в сгенерированных командах C #. Теперь вам нужно поработать с ними, чтобы обойти проблемы с тем, что он пытается сделать (например, попытаться удалить уже удаленные столбцы), и поставить на место то, что ему нужно будет продвигать (например, добавив обратно таблица, которая у вас есть в вашей модели, но вы удалили ее вручную в вашей базе данных).
После того, как вы добавили это и запустили update-database -f
, EF Code First просто с уверенностью примет, что вы обновили базу данных так, как она должна быть, и обновит ее хеш-код на основе конечного результата. Если вы сделали правильные изменения, теперь вы можете продолжить миграцию в обычном режиме. Если это по-прежнему вызывает ошибки, вы обычно можете скопировать команды переноса вручную куда-нибудь и удалить их. Восстановите базу данных из вашей резервной копии, снова добавьте перенос вручную и попробуйте снова. В худшем случае вы прибегаете к описанному выше шагу обратного инжиниринга.