Entity Framework 4 Code First - Предотвращение DB Drop/Create
Я написал приложение ASP.Net MVC 3, используя парадигму Code First, когда при изменении модели модель Entity Framework автоматически пытается воссоздать базовую базу данных SQL Server с помощью операторов DROP и CREATE. Проблема заключается в том, что приложение размещается на стороннем удаленном сервере, который ограничивает количество баз данных, которые я могу иметь, и, похоже, не позволяет мне программно выполнять инструкции "CREATE DATABASE...", как я понял из этого сообщения об ошибке:
Разрешить CREATE DATABASE в базе данных "master".
Есть ли способ остановить удаление Entity Framework и попытку воссоздать всю базу данных, а вместо этого просто удалить таблицы и повторно создать их?
После создания базы данных вручную и запуска приложения я также получаю следующую ошибку, я думаю, поскольку Entity Framework пытается изменить базу данных:
Совместимость модели не может быть проверена, потому что база данных не содержит метаданных модели. Убедитесь, что IncludeMetadataConvention добавлено в соглашения DbModelBuilder.
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Нашел этот камень через Google, это похоже на то, что вам нужно: http://nuget.org/Tags/IDatabaseInitializer
Вы можете использовать другой инициализатор базы данных. Допустим, ваш контекст называется SampleContext
, тогда ваш конструктор будет выглядеть так:
public SampleContext()
{
System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<SampleContext>());
}
Обратите внимание, что это инициализатор по умолчанию. Возможно, вам понадобится создать собственный пользовательский инициализатор, выполнив IDatabaseInitializer
. Здесь есть хорошая информация: http://sankarsan.wordpress.com/2010/10/14/entity-framework-ctp-4-0-database-initialization/
Ответ 2
Используя EF 4.3 с Migrations, вы не получите этого поведения - по крайней мере, я его не видел. Но у меня также есть этот набор в моем коде -
public sealed class DbConfiguration : DbMigrationsConfiguration<DatabaseContext>
{
public DbConfiguration()
{
AutomaticMigrationsEnabled = false;
}
}