Кажется, что это должно быть просто, но поведение EF6 по умолчанию всегда пытается использовать историю миграции. Интуитивно понятные подходы терпят неудачу. Например, если я просто создаю контекст и Call Create () :
Код: Выделить всё
using (var context = new MyDbContext(testConnectionString))
{
// This fails because EF detects a Migrations/Configuration.cs and
// tries to use the migration history, which I want to avoid.
context.Database.Create();
}
Мое рабочее решение имеет три части:
1. . Пользовательский идатабазеиализатор
Этот инициализатор отбрасывает все существующие таблицы, а затем создает и выполняет PRE-модели. />
Код: Выделить всё
public class TestDatabaseInitializer : IDatabaseInitializer
{
public void InitializeDatabase(MyDbContext context)
{
// Connection must be a MySqlConnection
var connection = (MySql.Data.MySqlClient.MySqlConnection)context.Database.Connection;
// 1. Drop all existing tables to ensure a clean slate
var tableNames = context.Database.SqlQuery("...query to get all table names...").ToList();
if (tableNames.Any())
{
var dropScriptText = "...script to drop all tables...";
new MySql.Data.MySqlClient.MySqlScript(connection, dropScriptText).Execute();
}
// 2. Generate a DDL script from the current model
var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
// (Note: I also have to patch this script with Regex for a separate bug, but that's not relevant to this question)
// 3. Execute the DDL script
var createScript = new MySql.Data.MySqlClient.MySqlScript(connection, dbCreationScript);
createScript.Execute();
}
}
Чтобы сохранить мой производственный mydbcontext чистый, я создал полученный контекст для тестирования, который устанавливает пользовательский инициализатор.
Код: Выделить всё
public class TestDbContext : MyDbContext
{
public TestDbContext(string connectionString) : base(connectionString)
{
Database.SetInitializer(new TestDatabaseInitializer());
}
}
Метод испытаний создает экземпляр testdbcontext и заставляет инициализацию.
Код: Выделить всё
[Test]
public void CanCreateDatabaseFromModel()
{
var testConnectionString = "server=localhost;...etc";
using (var context = new TestDbContext(testConnectionString))
{
// This triggers the custom initializer
context.Database.Initialize(force: true);
// Assert that tables were created...
Assert.IsTrue(context.Database.Exists());
}
}
В то время как мой пользовательский idatabaseinitializer работает, я чувствую, что я восстанавливаю функцию, которая уже должна существовать. Мне пришлось вручную написать логику, чтобы сбросить все таблицы, а затем использовать класс mysqlScript для выполнения сгенерированного скрипта.
Есть ли более прямой или «блаженный» способ в Entity Framework 6, чтобы рассказать DBContext экземпляр «Игнорировать все миграционную историю и просто создать схему DataBase, основанную на вашей современной модели модели? /> Я ищу что -то столь простое, как гипотетический контекст.database.createfromdel (force: true) , который не запутывается с трубопроводом миграций.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -bypassing
Мобильная версия