【发布时间】:2021-03-18 18:13:41
【问题描述】:
我使用 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 方法,尽管我认为不需要它,因为我在应用程序运行之前使用了 "add-migration" 、 "update-database" 命令。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext applicationDbContext)
{
applicationDbContext.Database.Migrate();
...
}
Microsoft 文档说对于 OnModelCreating 方法:“通常,此方法仅在创建派生上下文的第一个实例时调用一次。然后缓存该上下文的模型,并用于上下文中的所有进一步实例应用程序域。”
每次应用程序启动时,都会调用该方法并完成它的工作。这是第一次尝试这个,如果我没有一些扩展方法来尝试从文件中解析一些 DateTime 值,我什至不会注意到它。这些在我的笔记本电脑上坏了,因为我在台式电脑上有不同的语言环境。
OnModelCreating 是否在每次启动时运行以进行缓存?如果是这样,如果数据库上的一行被更新,缓存的行会发生什么?
我可以让它只运行一次(它必须在迁移文件上播种数据的时间)还是有其他方法可以做到这一点?
目前,当我在另一台机器上工作或想要添加另一个迁移并且我想要一个解决方法时,我会在这些部分中添加和删除。如果这是所有流程发生的正确方式,那么这意味着我必须修复我的扩展方法,以免它们在其他机器上中断。
【问题讨论】:
标签: c# entity-framework-core ef-code-first dbcontext