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初始化

asp.net核心数据库初始化(播种数据)

如果你不需要结果,那么你可以简单地返回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),而不是计算行数。