Ладно, ребята, спасибо за ввод!
Мне удалось решить эту проблему, сделав восстановление резервной копии полностью отдельным от того, что я делаю с 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, но это то, как я в итоге обошел все это с двумя строками подключения.