EntityFramework 6.0 CreateDatabaseIfNotExists Сначала код для создания базы данных

Что я делаю неправильно. У меня есть пользовательская настройка DbContext и работа, когда я изначально создал Code-First с powershell, все работало нормально.

Я реализовал инициализатор базы данных, как и ожидалось, при запуске приложения.

Database.SetInitializer<UserDbContext>(new CreateDatabaseIfNotExists<UserDbContext>());

Просто чтобы проверить, действительно ли он создает базу данных, я действительно удалил базу данных, и теперь я застрял, база данных не будет создана. Я использую SQL Server 2012, есть идеи, что может быть не так.

Сообщение об ошибке, которое я получаю,

System.InvalidOperationException: Migrations is enabled for context 'UserDbContext' but the database does not exist or contains no mapped tables. Use Migrations to create the database and its tables, for example by running the 'Update-Database' command from the Package Manager Console.

Я пробовал то же самое из консоли диспетчера пакетов, и он все еще дает мне то же сообщение.


person Sanj    schedule 23.10.2013    source источник


Ответы (2)


Наконец понял решения, не уверен, почему и что. Изменен мой инициализатор базы данных на MigrateDatabaseToLatestVersion вместо CreateDatabaseIfNotExists.

Database.SetInitializer<UserDbContext>(new MigrateDatabaseToLatestVersion<UserDbContext, Configuration>());
person Sanj    schedule 23.10.2013
comment
Я столкнулся с той же проблемой при создании файла db. Куда ты положил эту строчку? Файл Configuration.cs public Configuration() ? Потому что именно туда я его поместил, и он вылетает по сравнению с 2013 каждый раз, когда я запускаю команду update-database. люблю слышать от вас. - person Yustme; 09.02.2014
comment
@Yustme, тема довольно старая, но для протокола: вы настраиваете initializer в конструкторе Context. - person Akbari; 19.01.2016

Изменить: с вашим новым сообщением об ошибке проблема возникает из-за того, что вы включили миграцию и уже выполнили миграцию (возможно, первое создание базы данных), и с тех пор, как вы удалили БД, история миграции была потеряна. Если вы не используете автоматические миграции, вы не можете самостоятельно вносить изменения в базу данных и ожидать, что код сначала узнает об этом. Попробуйте отключить миграцию и снова включить ее, чтобы увидеть, очистит ли это историю миграции.

Вам нужно будет сделать вызов в БД либо для чтения, либо для вставки данных для изначально созданной БД. Код, который вы используете, только сообщает EF, что делать с базой данных, если она не существует, когда он пытается ее найти. Я использую метод, описанный в http://www.codeproject.com/Tips/411288/Ensure-Your-Code-First-DB-is-Always-Initialized

person Matthew Verstraete    schedule 23.10.2013
comment
Спасибо за ваш ответ. Я пробовал, это все еще не работает. - person Sanj; 23.10.2013
comment
Странно, у меня это сработало, ознакомьтесь с этим SO о различных методах инициализации вашей БД для получения дополнительных идей: stackoverflow.com/questions/12724320/ - person Matthew Verstraete; 23.10.2013
comment
Привет, Орел, я ТАК следил за тобой и почти все получил соответственно. То, что вы упомянули, я использую автоматическую миграцию, и история миграции хранится внутри самой базы данных, верно? Или я пропустил большую часть картины здесь. Теоретически удаление базы данных с включенной автоматической миграцией с правилом инициализации БД должно привести к воссозданию базы данных. Все равно не повезло.... - person Sanj; 23.10.2013
comment
Дата миграции хранится в специальной таблице в базе данных, поэтому при запуске автоматической миграции она ищет спецификацию БД в этой специальной таблице, сравнивает ее с новой схемой dbcontext и применяет любые изменения. Поскольку таблица отсутствует, ей не с чем сравнивать, и она терпит неудачу, поскольку ожидает, что база данных существует. Что вам нужно сделать, так это вручную запустить миграцию 0 (прочитайте раздел «Генерация и запуск миграции» @ msdn.microsoft.com/en-us/data/jj591621.aspx) или отключите, а затем снова включите миграцию. - person Matthew Verstraete; 23.10.2013