Рекомендуемый способ копирования / управления данными в моей базе данных при запуске в. net core / ef core? - PullRequest
0 голосов
/ 29 марта 2020

Суть моей ситуации заключается в том, что я имею дело с большой базой данных, и в зависимости от ее содержимого мой код может совершать любые неожиданные действия. Данные большие, но в ближайшее время они не будут сильно изменяться, все они находятся в одной базе данных в базе данных ms sql на моем компьютере. Давайте назовем это таблицей собак, которые никогда не меняются, но они необходимы для выполнения моих тестов.

В данный момент я пытаюсь написать скрипт Postman для «автоматического тестирования вручную» того, как мой код работает в этой базе данных. , Одной из проблем этого является то, что тесты, которые я буду выполнять, будут оставлять данные в базе данных за пределами таблицы dog, что я не хочу влиять на мой следующий тест. (Списки собак, учетные записи пользователей и тому подобное)

Возможно, из того, что я вижу, очевидным решением было бы разместить мою базу данных с собаками в отдельной базе данных на моем компьютере от той, которая использовалась моим приложением, и пусть мое приложение копирует эту базу данных каждый раз, когда я запускаю приложение. Другим может быть создание резервной копии базы данных перед тем, как я начну тестирование, и восстановление базы данных до того места, где она была в последний раз в конце теста. Это сэкономит значительное количество времени (у меня много собак) и позволит мне просто удалить данные, созданные как побочный эффект моих тестов API.

Однако я новичок когда дело доходит до (мс) SQL. Это хороший подход к решению проблемы? Как бы я go сделал что-то подобное в моей базе данных? Могу ли я сделать это из ядра ef?

1 Ответ

0 голосов
/ 30 марта 2020

Ладно, ребята, спасибо за ввод!

Мне удалось решить эту проблему, сделав восстановление резервной копии полностью отдельным от того, что я делаю с EF Core. После дополнительных исследований я обнаружил документы по посеву, хотя то, что они делают, немного отличается от этой рекомендации против этого, и рекомендую вводить данные через отдельное приложение.

Теперь в в моем случае я действительно не хотел отдельного приложения для этого, которое мне приходилось бы запускать каждый раз, когда я хочу запустить тесты E2E или проводить ручное тестирование, поэтому я поместил это в метод Main моего API (вероятно, это плохая практика, но это работает для того, что мне нужно). Stati c функция заполнения, которая использует SqlConnection и SqlCommand для восстановления базы данных, ничего сложного, когда вы туда доберетесь, но мне потребовалось некоторое время, чтобы понять, что я поделюсь с вами любопытными.

Обратите внимание, что для создания резервной копии мне пришлось изменить строку подключения для исходной базы данных, которая будет основной базой данных. Строки подключения Appsettings в итоге выглядят так:


  "ConnectionStrings": {
    "Default": "Server=.\\SQLExpress;AttachDbFilename=c:\\MyDoggos.mdf;Database=MyDoggos; Trusted_Connection=Yes; MultipleActiveResultSets=true",
    "Seeding": "Server=.\\SQLExpress;AttachDbFilename=C:\\Program Files\\Microsoft SQL Server\\MSSQL15.SQLEXPRESS\\MSSQL\\DATA\\master.mdf;Database=master; Trusted_Connection=Yes; MultipleActiveResultSets=true"

  },
    public class Program
    {
        public static void Main(string[] args)
        {
            DatabaseSeeder.Seed();
            CreateHostBuilder(args).Build().Run();
        }
    public class DatabaseSeeder
    {
        public static void Seed()
        {
            string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            if (environment == "Development")
            {
                string basePath = Directory.GetCurrentDirectory();

                var builder = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

                IConfigurationRoot configuration = builder.Build();

                string connectionString = configuration.GetConnectionString("Seeding");

                var stm = @"RESTORE DATABASE MyDoggos FROM DISK = 'DogsBackup.bak';";

                using (var con = new SqlConnection(connectionString))
                {
                    con.Open();

                    var cmd = new SqlCommand(stm, con);
                    cmd.ExecuteNonQuery();


                }

            }

        }
    }

Обратите внимание, что для заполнения я использую базу данных master в качестве начальной базы данных в строке подключения, но для ядра EF я использую базу данных MyDoggos как моя строка соединения для текста данных. Несмотря на то, что основная база данных является исходной базой данных, поскольку я указываю базу данных MyDoggos для запроса, это затрагивает только MyDoggos.

Не уверен, что вы можете каким-то образом указать базу данных для использования аналогичным образом при использовании ядра EF, но это то, как я в итоге обошел все это с двумя строками подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...