我使用code first ef core创建了一个数据库,并通过重写OnModelCreating方法使用迁移文件作为种子。
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<TestModel> TestModel{ get; set; }
....
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Seed();
}
Seed方法从多个excel文件中读取,并从每一行创建新实体。
modelBuilder.Entity<TestModel>().HasData(
new TestModel
{
Id = int.Parse(reader.GetValue(0).ToString()),
....
}
在Startup.cs上,我获得了dbContext并调用了Migrate方法,尽管我不认为它是必要的,因为我在应用程序运行之前使用了“添加-迁移”和“更新数据库”命令。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext applicationDbContext)
{
applicationDbContext.Database.Migrate();
...
}
微软文档说,对于OnModelCreating方法:“通常,当派生上下文的第一个实例是created.The模型时,这个方法只被调用一次,然后该上下文的模型被缓存,并用于应用程序域中上下文的所有其他实例。”
每次应用程序启动时,都会调用该方法并执行它的工作。这是第一次尝试这样做,老实说,如果我没有一些扩展方法尝试解析文件中的一些DateTime值,我甚至不会注意到这一点。因为我的笔记本电脑和台式机的语言环境不同,所以我的笔记本电脑上出现了这些问题。
OnModelCreating是否在每次启动时都运行以进行缓存?如果是这样,如果数据库上的一行被更新,那么缓存的行会发生什么情况呢?
我可以让它只运行一次(它必须在迁移文件中植入数据的时间),还是有其他方法可以做到这一点?
目前,当我在另一台机器上工作,或者想要添加另一个迁移,并且我想要一个变通方法时,我会对这些部分进行注释。如果这是所有流发生的正确方式,那么这意味着我必须修复我的扩展方法,这样它们就不会在其他机器上中断。
发布于 2020-12-07 13:07:23
我使用的EF Core的data seeding (它有许多限制,请参阅链接)的替代方案是:
https://stackoverflow.com/questions/65181728
复制