Моя цель - создать свежую, пустую схему базы данных непосредственно из текущего dbcontext model для каждого тестового запуска. Я хочу полностью игнорировать существующую историю миграции проекта, поскольку запуск десятков миграций является медленным и ненужным для этих тестов. < /P>
Кажется, что это должно быть просто, но поведение 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();
}
Этот инициализатор отбрасывает все существующие таблицы, а затем генерирует и выполняет сценарий DDL из текущей модели.
Код: Выделить всё
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();
}
}
< /code>
[b] 2. Выделенный testdbcontext Чтобы сохранить мою производственную MyDbContext чист, я создал производный контекст для тестирования, который устанавливает пользовательский инициализатор.
Код: Выделить всё
public class TestDbContext : MyDbContext
{
public TestDbContext(string connectionString) : base(connectionString)
{
Database.SetInitializer(new TestDatabaseInitializer());
}
}
< /code>
[b] 3. Метод испытаний [/b]
Метод испытаний создает экземпляр 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 для выполнения сгенерированного скрипта. Конфигурация "?
Я ищу что -то столь простое, как гипотетический контекст.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -bypassing
Мобильная версия