我有一个 sqlite 数据库,其中在我的 DataContext 类中定义了一个表:
public DbSet<SystemInfo> SystemInformation { get; set; }
此表始终只包含一行系统信息:
public class SystemInfo
{
public SystemInfo() { }
[DefaultValue("1")]
[Key]
public int Id { get; set; }
public uint NoOfEmailsSentDayily { get; set; }
public bool autoEmail { get; set; }
}
我想要的是在第一次运行我的应用程序时为表插入一个初始行。我怎样才能做到这一点?
您可以使用
OnModelCreating
方法来做到这一点
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SystemInfo>().HasData(
new SystemInfo
{
NoOfEmailsSentDayily = 1,
autoEmail = true
}
);
}
或者您可以创建一个可以在您的
Main
程序上调用的播种方法
public class DataSeeder
{
public static void SeedSystem(DbContext context)
{
if (!context.SystemInfo.Any())
{
var sysInfo = new SystemInfo
{
NoOfEmailsSentDayily = 1,
autoEmail = true
}
context.SystemInfo.Add(sysInfo);
context.SaveChanges();
}
}
}
然后按照你的方法
public void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
DataSeeder.SeedSystem(context);
}
host.Run();
}
假设您使用 DependecyInjection: 一种可能的解决方案是您在应用程序启动时编写扩展。
启动时:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.AutoFill();
//...
}
扩展:
public static class Extensions
{
public static IApplicationBuilder AutoFill(this IApplicationBuilder app)
{
using var scope = app.ApplicationServices.CreateScope();
var mycontext = scope.ServiceProvider
.GetRequiredService<IMyDbContext>(); //Insert correct name of db context or db context interface
if (mycontext.SystemInformation.FirstOrDefault() != null)
{
return app;
}
SystemInformation sysInfo = new();
//fill SystemInformation
mycontext.Add(sysInfo);
mycontext.SaveChanges();
}
}