我的情况的要点是,我正在处理一个大型数据库,根据它的内容,我的代码可能会做各种意想不到的事情。数据很大,但预计短期内不会有太大变化,所有这些都在我计算机上的mssql数据库上的单个数据库中。让我们称它为一张狗的表格,这些狗永远不会改变,但对我运行测试是必不可少的。
目前,我正在尝试编写一个Postman脚本,以便“自动手动测试”我的代码在此数据库上的执行情况。其中一个问题是,我将运行的测试将把数据留在dog表之外的数据库中,我不想影响我的下一个测试。(狗的列表,用户账号,诸如此类的东西)
从我所看到的情况来看,一个显而易见的解决方案是将我的狗数据库放在我的计算机上与我的应用程序使用的数据库不同的数据库中,并在每次启动应用程序时让我的应用程序复制该数据库。另一种方法是在开始测试之前备份数据库,并将数据库恢复到测试结束时的最后一点。这将节省大量的时间(我有很多狗),并允许我删除作为API测试的副作用而创建的数据。
然而,当涉及到(MS)SQL时,我还是一个初学者。这些是解决问题的好方法吗?我该如何在我的数据库上做这些事情呢?我可以在ef核心中做这件事吗?
发布于 2020-03-30 11:16:29
好了,伙计们,谢谢你们的投入!
我设法解决了这个问题,使备份恢复完全独立于我在EF Core中所做的任何事情。经过更多的研究后,我发现the docs on seeding, although what theyre doing is a bit different from this不建议这样做,并建议您通过单独的应用程序输入数据。
现在,在我的例子中,我真的不想要一个单独的应用程序,每次我想运行E2E测试或进行手动测试时都必须启动它,所以我把它放在我的API的Main方法中(可能是不好的做法,但它可以满足我的需要)。一个静态种子函数,它使用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();
}
}
}
}
注意,对于种子,我使用主数据库作为连接字符串中的初始数据库,但是对于EF核心,我使用MyDoggos数据库作为数据上下文的连接字符串。尽管主数据库是初始数据库,但由于我为查询指定了MyDoggos数据库,因此只有MyDoggos会受到影响。
不确定在使用EF核心时,您是否可以以类似的方式指定要使用的数据库,但这就是我最终如何解决它,使用2个连接字符串。
https://stackoverflow.com/questions/60917486
复制相似问题