Ответ 1
Оказалось, что это пользовательские разрешения для основной базы данных. Странно, что использование DropCreateDatabaseAlways не требует прав на основную базу данных, где IfModelChanges делает.
Я использую следующий код в своем приложении Global.asax:
DbDatabase.SetInitializer<MyDBContext>
(new DropCreateDatabaseIfModelChanges<MyDBContext>());
но он не работает.
Хотя моя модель изменилась, и я пытаюсь использовать одну из недавно добавленной таблицы, она просто говорит, что таблица не найдена.
Invalid object name 'dbo.TableName'.
Если я запустил это, это работает, и таблица создается:
DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>());
Он обновляет мою базу данных.
Что я делаю неправильно?
Оказалось, что это пользовательские разрешения для основной базы данных. Странно, что использование DropCreateDatabaseAlways не требует прав на основную базу данных, где IfModelChanges делает.
Для чего это стоит, я столкнулся с множеством проблем с обеими стратегиями DropCreate, потому что Cassini все еще работал после того, как я закрыл браузер. (У меня была такая же проблема с IIS Express.) Поскольку локальный веб-сервер все еще работал, Application_Start
не запускался снова, поэтому инициализация, которую я там поставил, никогда не выполнялась.
Я разрешил его, включив Edit и Continue:
Свойства проекта > Веб > Отладчики > Включить редактирование и продолжение
Это заставляет локальный веб-сервер закрываться при закрытии браузера.
У меня была такая же проблема:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());
В моем случае база данных уже существовала, когда я добавил вышеприведенную строку кода. Я сбросил db и снова запустил свою программу, и он начал работать, как ожидалось. Только другой конфликт, возможно, был причиной, я играл с "Enable-Migrations" в базе данных.
НТН
Такое поведение ожидается в случае удаления IncludeMetadataConvention:
modelBuilder.Conventions.Remove<System.Data.Entity.Database.IncludeMetadataConvention>();