Entity Framework CTP4: где поставить SetInitializer? - PullRequest
6 голосов
/ 09 сентября 2010

Я пытаюсь добавить Entity Framework, сначала код, в приложение MVC, работающее с тестовыми данными, используя предварительный просмотр CTP4.

В настоящее время я получаю эту ошибку:

Модель, поддерживающая контекст SchedulerContext, изменилась с момента создания базы данных.Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer.Например, стратегия RecreateDatabaseIfModelChanges автоматически удалит и заново создаст базу данных и при необходимости заполнит ее новыми данными.

Я вообще не хочу создавать базу данных, поскольку у меня уже есть база данных.Поэтому я попытался добавить следующее в конструктор SchedulerContext:

Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());

, который никак не повлиял - я получил ту же ошибку при следующем запуске.Кажется, ошибка возникает при выполнении оператора LINQ, который обращается к базе данных - я думаю, это первое.

Куда я должен поместить это утверждение, или это утверждение вообще ответ на эту проблему?

Ответы [ 4 ]

9 голосов
/ 09 сентября 2010

Обновление

Я просто закрыл глаза тем фактом, что у вас уже есть база данных, и не не хочет создавать другую ... в этом случае ответ заключается в том, чтобы поместить это в ваш класс SchedulerContext

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
    modelBuilder.IncludeMetadataInDatabase = false;
}

Старый ответ

Вы обычно помещаете это в Global.asax

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}

Обратите внимание, что он будет инициализирован только при первом использовании контекста данных.

Обновление

public class DataContextInitializer : CreateDatabaseOnlyIfNotExists<SchedulerContext> {
    protected override void Seed(SchedulerContext context) {
    }
}

Затем вы изменяете SetInitializer следующим образом.

System.Data.Entity.Infrastructure.Database.SetInitializer<SchedulerContext>(new  DataContextInitializer());
4 голосов
/ 18 января 2011

Кстати, начиная с CTP5, это правильный способ установки инициализатора в Global.asax

protected void Application_Start() { System.Data.Entity.Database.DbDatabase.SetInitializer<NerdDinners>(new System.Data.Entity.Database.DropCreateDatabaseIfModelChanges<NerdDinners>()); }

3 голосов
/ 08 июля 2011

В EF 4.1

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
1 голос
/ 30 сентября 2010

Проблема в том, что команда ADO.NET создает соединение как

 connectionBuilder = new SqlConnectionStringBuilder(sqlConnection.ConnectionString)
                {
                    InitialCatalog = "master",
                    AttachDBFilename = string.Empty, 
                };

НО sqlConnection.ConnectionString - это чистая строка подключения, указанная в файле конфигурации приложения, но без пароля! из-за соображений безопасности, я думаю ... поэтому открытие такого подключения завершится неудачно !


Единственное возможное решение, которое я нашел, - это использовать встроенную защиту, то есть установить свойство строки соединения Integrated Security = SSPI

А нам нужно подождать, пока будет патч или CTP5; о)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...