使用 DbUp 的实体框架代码优先
Posted
技术标签:
【中文标题】使用 DbUp 的实体框架代码优先【英文标题】:Entity Framework Code First with DbUp 【发布时间】:2018-07-07 01:24:27 【问题描述】:我正在考虑使用 Entity Framework 6
Code First
与 DbUp
进行数据库交互来进行数据库架构更新。问题是我不想使用 EF
迁移是有原因的。所以,我已经达到的工作流程是:
-
更改模型(添加
POCO
s、更改属性等)
在Visual Studio Package Manager Console
中运行Add-Migration temp_file
在Visual 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-Migration
和 temp_file
的情况下生成 sql 脚本。正是你想要的。跳过第 2 步和第 6 步。执行第 1、3、4、5、7 步。
我不明白如何通过Automatic Migration
找回SQL
脚本。能详细点吗?
只做你目前正在做的事情except Add-Migration
命令。对模型进行修改后,在 Visual Studio 包管理器控制台中执行Update-Database -Script
。该命令将生成sql
文件并在VS 中打开它。抓取生成的sql
脚本……等等等等
成功了!谢谢!尽管我正在等待其他可能的解决方案,但您回答了我的问题。我需要挖掘局限性。如果您不介意,最后一点:您在项目中遵循什么策略?以上是关于使用 DbUp 的实体框架代码优先的主要内容,如果未能解决你的问题,请参考以下文章