在实体框架第一次启动时插入一行

问题描述 投票:0回答:2

我有一个 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; }
    }

我想要的是在第一次运行我的应用程序时为表插入一个初始行。我怎样才能做到这一点?

c# sql sqlite
2个回答
0
投票

您可以使用

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();
}

0
投票

假设您使用 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();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.