asp.net核心数据库初始化(播种数据)
本文关键字:数据 初始化 net 核心 数据库 asp | 更新日期: 2023-09-27 18:17:53
我想用数据初始化数据库,只要这样的数据还不存在。在本例中,只要表"Country"为空,就会插入数据。下面是"Startup"类的代码:
public class Startup
{
// lines of code...
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// lines of code...
app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed();
}
}
public static class DbContextExtensions
{
public static void Seed(this ApplicationDbContext db)
{
AddCountries(db); // <= WARNING HERE
}
private static async Task AddCountries(ApplicationDbContext db)
{
if (await db.Country.CountAsync() == 0)
{
db.AddRange(
new Country { Name = "England", Code = "En" },
new Country { Name = "France", Code = "Fr" }
);
}
db.SaveChanges();
}
}
指定行的结果是一个编译警告"因为没有等待此调用,因此在调用完成之前继续执行当前方法"。这是一个同步方法,我调用了一个异步方法。解决这个问题的最佳方法是什么(两种选择都可以:在继续执行的同时启动异步处理以插入数据,或者等待其完成然后继续)
另外,我想知道是否使用ApplicationDbContext更好。OnModelCreating而不是Startup。配置所描述的DB初始化
如果你不需要结果,那么你可以简单地返回void而不是Task。这样可以省去警告
private static async void AddCountries(ApplicationDbContext db)
{
if (db.Country.Any())
{
return; // DB has been seeded
}
db.AddRange(
new Country { Name = "England", Code = "En" },
new Country { Name = "France", Code = "Fr" }
);
db.SaveChanges();
}
但是,您应该使用await来执行实际操作(Task),而不是计算行数。