使用 DbUp 的实体框架代码优先

Posted

技术标签:

【中文标题】使用 DbUp 的实体框架代码优先【英文标题】:Entity Framework Code First with DbUp 【发布时间】:2018-07-07 01:24:27 【问题描述】:

我正在考虑使用 Entity Framework 6 Code FirstDbUp 进行数据库交互来进行数据库架构更新。问题是我不想使用 EF 迁移是有原因的。所以,我已经达到的工作流程是:

    更改模型(添加POCOs、更改属性等) 在Visual Studio Package Manager Console 中运行Add-Migration temp_fileVisual Studio Package Manager Console 中运行Update-Database -Script 获取生成的sql 脚本,包括在表__MigrationHistory 中插入新行 创建一个新的.sql 文件并传递生成的脚本 删除temp_file 运行 DbUp

它在本地和生产服务器上完美运行,但是每次生成新迁移时我都不愿意添加然后删除 temp_file(我希望有一种方法可以永久停止将 temp_file 添加到解决方案。)。

所以问题: 有没有更好的方法来使用DbUp 使用Entity Framework 进行数据库迁移?

【问题讨论】:

我很困惑,所以你不使用生成后的迁移而只是删除类? @Saruman 是的,正确。 我认为您可以使用 power shell 配置文件扩展包管理器控制台,并且您可以编写自定义命令以满足您的需求 @Saruman 是的,但我对我的方法持怀疑态度。 EF 和 DbUp 已经存在了很长一段时间,建议的命令应该已经创建。 如果您使用工具从 POCO 模型生成创建表脚本并且根本不依赖实体框架进行迁移,那么每次运行 dbup 时都会创建模型。 【参考方案1】:

也许这个答案为时已晚,但也许它也会有用。我完全理解您将实体框架用作 ORM 和用于模式迁移的不同工具的方法。但是选择 DbUp 需要您手动编写 SQL 或如上所述生成它们。我建议考虑使用FluentMigrator 而不是 DbUp。它遵循相同的理念,但允许使用流利的语法在 C# 中编写迁移步骤。此外,它还支持降级,即回滚。

这是一个例子:

[Migration(1)]
public class CreateUserTable : Migration

    public override void Up()
    
        Create.Table("Users");
    

    public override void Down()
    
        Delete.Table("Users");
    

【讨论】:

谢谢鲍里斯。我还没有深入研究DbUp,但我听说过很多成功的故事,在DbUp 中某些东西是可行的,而使用其他工具是不可能的。特别是,我认为DbUp 的理念总是Up 比其他方法更好。 您可以通过不实现 Down 方法来使用 FluentMigrator 的相同技术。您可以将其留空。 有道理。【参考方案2】:

在大多数情况下,您可以使用Automatic Code First Migrations 跳过步骤 (2) 和 (6):

Automatic Migrations 允许您使用 Code First Migrations您所做的每项更改都无需在项目中生成代码文件

默认情况下禁用自动迁移。您可以通过在 db 迁移配置类构造函数(通常称为 Configuration 并位于 Migrations 子文件夹下)添加以下内容来启用它们:

AutomaticMigrationsEnabled = true;

需要考虑的一些事项:

文档指出自动迁移有限制,因此请注意。 您可以混合使用自动迁移和基于代码的迁移(换言之,建议的方法和您当前的方法)。 您当前方法的好处是您可以预览 EF 如何解释您的模型更改,还可以添加/删除/更改部分迁移代码。 自动迁移已在 EF Core 中被弃用(不存在),因此在 EF Core 项目中,您必须使用与当前方法类似的方法,但必须保留生成的迁移代码文件。

【讨论】:

Automatic Migration 不是大型企业制作的选项。有时,用一些简单的SQL 脚本可以在几分钟内完成,而EF 在几小时内完成 @Hans 我不明白你的评论。如果您仔细阅读我的回答,我并不是建议自动迁移来实际升级数据库,而是建议在不发出 Add-Migrationtemp_file 的情况下生成 sql 脚本。正是你想要的。跳过第 2 步和第 6 步。执行第 1、3、4、5、7 步。 我不明白如何通过Automatic Migration 找回SQL 脚本。能详细点吗? 只做你目前正在做的事情except Add-Migration 命令。对模型进行修改后,在 Visual Studio 包管理器控制台中执行Update-Database -Script。该命令将生成sql 文件并在VS 中打开它。抓取生成的sql 脚本……等等等等 成功了!谢谢!尽管我正在等待其他可能的解决方案,但您回答了我的问题。我需要挖掘局限性。如果您不介意,最后一点:您在项目中遵循什么策略?

以上是关于使用 DbUp 的实体框架代码优先的主要内容,如果未能解决你的问题,请参考以下文章

无法使用实体框架代码优先创建具有凭据的数据库?

在实体框架中使用存储过程(代码优先)

使用带有代码优先的实体框架,没有自动增量

实体框架代码优先 - 保存实体时设置属性的最佳方法是啥

实体框架代码优先多对多不使用 GUID 加载相关实体

调试代码优先的实体框架迁移代码