EF CodeFirst: DropCreateDatabaseIfModelChanges не работает

Я использую следующий код в своем приложении Global.asax:

DbDatabase.SetInitializer<MyDBContext>
   (new DropCreateDatabaseIfModelChanges<MyDBContext>());

но он не работает.

Хотя моя модель изменилась, и я пытаюсь использовать одну из недавно добавленной таблицы, она просто говорит, что таблица не найдена.

Invalid object name 'dbo.TableName'.

Если я запустил это, это работает, и таблица создается:

DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>());

Он обновляет мою базу данных.

Что я делаю неправильно?

Ответы

Ответ 1

Оказалось, что это пользовательские разрешения для основной базы данных. Странно, что использование DropCreateDatabaseAlways не требует прав на основную базу данных, где IfModelChanges делает.

Ответ 2

Для чего это стоит, я столкнулся с множеством проблем с обеими стратегиями DropCreate, потому что Cassini все еще работал после того, как я закрыл браузер. (У меня была такая же проблема с IIS Express.) Поскольку локальный веб-сервер все еще работал, Application_Start не запускался снова, поэтому инициализация, которую я там поставил, никогда не выполнялась.

Я разрешил его, включив Edit и Continue:

Свойства проекта > Веб > Отладчики > Включить редактирование и продолжение

Это заставляет локальный веб-сервер закрываться при закрытии браузера.

Ответ 3

У меня была такая же проблема:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());

В моем случае база данных уже существовала, когда я добавил вышеприведенную строку кода. Я сбросил db и снова запустил свою программу, и он начал работать, как ожидалось. Только другой конфликт, возможно, был причиной, я играл с "Enable-Migrations" в базе данных.

НТН

Ответ 4

Такое поведение ожидается в случае удаления IncludeMetadataConvention: modelBuilder.Conventions.Remove<System.Data.Entity.Database.IncludeMetadataConvention>();