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

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

Сообщение Anonymous »

Я настраиваю автоматическую среду тестирования интеграции для большого существующего проекта Entity Framework 6, который использует базу данных MySQL. Я хочу полностью игнорировать существующую историю миграции проекта, так как запуск десятков миграций является медленным и ненужным для этих тестов.
Кажется, что это должно быть просто, но поведение 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 Инициализатор имеет одинаковую проблему; Похоже, он знает о конфигурации миграции и не просто создается из модели. Этот подход кажется очень жестким, и мне интересно, есть ли более простой способ.
Мое рабочее решение имеет три части:
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();
}
}
2. Выделенный testdbcontext
Чтобы сохранить мой производственный mydbcontext чистый, я создал полученный контекст для тестирования, который устанавливает пользовательский инициализатор.

Код: Выделить всё

public class TestDbContext : MyDbContext
{
public TestDbContext(string connectionString) : base(connectionString)
{
Database.SetInitializer(new TestDatabaseInitializer());
}
}
3. Метод тестирования
Метод испытаний создает экземпляр 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
Ответить

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

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

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

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

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