Как создать базу данных из скрипта SQL с помощью Entity Framework Core?

Я начинаю проект с EF Core, где база данных уже существует. У меня есть структура базы данных в виде сценария sql, которую я хотел бы запускать каждый раз, когда я инициализирую контекст, чтобы иметь свежую базу данных каждый раз, когда я запускаю приложение. Ниже следует фрагмент из традиционной EF, показывающий, чего я хотел бы достичь с помощью EF Core.

    internal sealed class AnnotationContextDatabaseInitializer : DropCreateDatabaseAlways<AnnotationContext>
{
    public override void InitializeDatabase(AnnotationContext context)
    {
        base.InitializeDatabase(context);
        context.Database.ExecuteSqlCommand(TransactionalBehavior.EnsureTransaction, File.ReadAllText("dropAndCreateEntireDatabase.sql"));
    }
}

0 ответов

После того, как я получил больше опыта с EF, я понял, что нет смысла использовать контекст для таких вещей, как создание БД. Это была бы проблема с куриным яйцом, если бы контекст недействителен, если в нем отсутствуют базовые таблицы.

Это можно сделать с помощью традиционной SqlCommand, запустив сценарий, содержащий БД.

´´´

    public void ExecuteNonQuery(string query, string connectionString)
    {
        string[] splitter = new string[] {"\r\nGO"};
        string[] commandTexts = query.Split(splitter, StringSplitOptions.RemoveEmptyEntries);

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.RetryOpen();

            foreach (var commandText in commandTexts)
            {
                try
                {
                    using (SqlCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = commandText;
                        cmd.CommandType = CommandType.Text;
                        cmd.ExecuteNonQuery();
                    }
                }
                catch (Exception)
                {
                    connection.Close();
                    throw;
                }
            }

            connection.Close();
        }
    }

´´´

Это можно запустить, скажем, в тестовой инициализации.

Другие вопросы по тегам