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

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

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

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

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

【问题讨论】:

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

标签: c# entity-framework database-migration 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 脚本……等等等等
  • 成功了!谢谢!尽管我正在等待其他可能的解决方案,但您回答了我的问题。我需要挖掘局限性。如果您不介意,最后一点:您在项目中遵循什么策略?
猜你喜欢
  • 1970-01-01
  • 2017-09-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多