使用 Entity Framework Core 在运行时迁移

Posted

技术标签:

【中文标题】使用 Entity Framework Core 在运行时迁移【英文标题】:Migrating at runtime with Entity Framework Core 【发布时间】:2017-04-26 17:31:41 【问题描述】:

我正在将 php/Illuminate 应用程序移植到 ASP.NET Core/EF Core。其中一部分包括一个类似于 Wordpress 的安装过程,该过程要求提供数据库凭据,然后创建应用程序运行所需的表。本质上,我想在运行时运行某种迁移,就像使用 Illuminate 的模式构建器一样。

我找到了Microsoft.EntityFrameworkCore.Migrations namespace 的参考资料,这似乎与我想做的事情有关,但我似乎找不到任何有关如何实际使用它的文档或最佳实践。我想我可以编写原始 SQL 查询并执行这些查询,但如果可能的话,我更愿意使用一个不错的强类型 API。

EF Core 是否可以做到这一点,是否有人对如何做到这一点有一些建议?我目前正在使用Pomelo mysql provider,如果这有什么不同的话。

【问题讨论】:

【参考方案1】:

假设您已经准备好迁移,在您的 Startup 类中这样的事情就可以解决问题:

public void ConfigureServices(IServiceCollection services)

    // Wire up whatever your equivalent DbContext class is here
    services.AddDbContext<ApplicationDbContext>();


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

    using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
    
        scope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate();
    

【讨论】:

感谢您的回答。此解决方案似乎要求在运行 Migrate() 之前存在 __EFMigrationsHistory 表,这在我的用例中无法保证(假设现有数据库没有表)。有没有解决的办法?例如,我可以手动运行实际的架构构建代码吗?我应该注意,此项目不需要维护迁移历史记录并进行进一步的迁移。 我没有亲自使用过,但 EnsureCreated 方法可能会满足您的需求。看起来它完全绕过了迁移系统。 docs.microsoft.com/en-us/ef/core/api/… 旁注:Database.Migrate() 之前不需要历史表,但它会首次为您创建它。它用于跟踪应用的迁移,以防您将来要对数据库进行更改。如果您只是第一次想要架构和表并且永远不会更新它,那么您可以按照@BradMelanson 的建议使用context.Database.EnsureCreated() 当然假设您使用的是 Microsoft.EntityFrameworkCore;使用 Microsoft.EntityFrameworkCore.Infrastructure;某处,因为它们是扩展方法...

以上是关于使用 Entity Framework Core 在运行时迁移的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 性能优化

在 Entity Framework Core 中使用 [ComplexType]

在 Entity Framework Core 中使用 SQL 视图

使用 Entity Framework Core 更新相关数据

使用 Entity Framework Core 自动增加部分主键

如何使用 Entity Framework Core 模拟异步存储库