Как я могу заставить EF6 создать тестовую базу данных из текущей модели, обходя миграции?MySql

Форум по Mysql
Ответить
Anonymous
 Как я могу заставить EF6 создать тестовую базу данных из текущей модели, обходя миграции?

Сообщение Anonymous »

Я настраиваю автоматическую среду тестирования интеграции для большого существующего проекта Entity Framework 6, который использует базу данных MySQL.
Моя цель - создать свежую, пустую схему базы данных непосредственно из текущего 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();
}
Использование стандартных CreatedAtabaseifnotexists Инициализатор имеет одинаковую проблему; Похоже, он знает о конфигурации миграции и не просто создается из модели. Этот подход кажется очень жестким, и мне интересно, есть ли более простой способ. Пользовательский iDatabaseInitializer
Этот инициализатор отбрасывает все существующие таблицы, а затем генерирует и выполняет сценарий 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 
[/b]
Чтобы сохранить мою производственную 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»