【问题标题】:OnModelCreating method runs everytime the Application starts每次应用程序启动时都会运行 OnModelCreating 方法
【发布时间】: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


    【解决方案1】:

    我使用的 EF Core 的 data seeding(有许多限制,请参阅链接)的替代品是:

    • 将种子数据作为迁移的一部分,也就是将代码添加到迁移文件中。
    • 添加仅填充数据的额外专用迁移 - 例如添加新行以引用类似表的迁移(可用的类似“枚举”的数据)。
    • 添加一个不是由 EF 而是由其他东西调用的函数 - 此方法包含添加所有必要数据的代码(例如 LINQ-to-SQL)。

    【讨论】:

    • 感谢您的回复。在第一个项目符号上,您的意思是手动将代码添加到迁移文件中吗?如果是这样,文件包含数百行,这是不可能的。在第二个项目符号上,除了从只包含表的创建和删除的干净的第一次迁移和包含所有数据的第二次迁移之外,我的问题会得到什么?如果我没记错的话,无论应用程序启动时的迁移次数如何,OnModelCreating 方法都会运行。在第三颗子弹上。要么创建另一个应用程序,该应用程序将在初始迁移后仅运行一次并填充数据。
    • a) 是的,我的意思是修改迁移的 cs 文件。我不认为行数在这里是相关的。这些只是选项,如果它们不适合您的场景也没关系。
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多