Я немного застрял с кодом EF-first, чтобы создать новую базу данных. У нас есть существующая база данных и успешно используется подход Model-First. Теперь я хотел бы существующую модель, чтобы создать новую базу данных во время выполнения, как это:EF 6 Code-First, не создавая одну таблицу
public class DatabaseInitializer : IDatabaseInitializer<MDREntities>
{
public void InitializeDatabase(MDREntities dbContext)
{
if (dbContext.Database.Exists())
{
// Delete the existing database
dbContext.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "ALTER DATABASE [" + dbContext.Database.Connection.Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
dbContext.Database.Delete();
}
// Create new database
dbContext.Database.Create();
// Add initial data
addMasterData(dbContext);
// Commit changes.
dbContext.SaveChanges();
}
}
Вышеизложенных прогонов через успешно и все мои таблицы созданы для 1 исключения.
Я сделал следующее без везения:
- таблица делает существует в модели EDMX.
- Модель .tt-файла генерирует класс для таблицы.
- В контексте .tt-файла создается таблица DbSet для таблицы.
- Я удалил мою модель edmx и воссоздал из базы данных.
Возможно ли «проследить», что делает dbContext.Database.Create();
, и если что-то действительно не так?
Я также заметил, что «отсутствующая» таблица является единственной с составной частью PK, может возникнуть проблема?
Update:
Когда я взглянул на SQL Profiler
, я нашел этот комментарий о том, что таблица игнорируется. К сожалению, это не говорит, почему:
-- Ignoring entity set with defining query: [MDRModelStoreContainer].[tblRelatedPatient]
Вот таблица отображается в EDMX:
Попробуйте добавить 'dbContext.Database.Log = System.Console.Write', чтобы получить выход SQL, сбрасываемый на консоль. –
@JasonGerard, к сожалению, 'dbContext.Database.Log' не записывал операторы' CREATE TABLE', а только 'ALTER DATABASE ...' и 'INSERT INTO ...'. Я посмотрел на профилировщика. Соответственно обновляющий вопрос. –