如何禁用代码优先迁移

Posted

技术标签:

【中文标题】如何禁用代码优先迁移【英文标题】:How can I disable code first migrations 【发布时间】:2013-01-17 05:21:28 【问题描述】:

我在 EF5 中有一个代码优先的实体模型。但我想手动管理数据库更改——我不希望 EF 修改我现有的数据库及其所有数据。但是当我在 EF 映射和数据库中进行并行更改时,EF 拒绝正常运行,告诉我需要先使用代码迁移。如何关闭此功能?

【问题讨论】:

How can I disable migration in Entity Framework 6.0的可能重复 【参考方案1】:

我刚刚通过

解决了这个“问题”
    正在从数据库中删除表“_MigrationHistory”。 从项目中删除“迁移”文件夹。 正在更新 EDMX 文件。 清理项目并重建它。

我的环境配置如下

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

【讨论】:

请问您在 EDMX 文件中更新了什么?我也在使用数据库优先,它仍在查询不存在的迁移表...谢谢! 如果以后我们需要迁移怎么办,它会自动创建新的_MigrationHistory 表吗?【参考方案2】:

所以我找到的最完整的答案是:

    删除项目中的Migrations 文件夹。 在 DatabaseContext 初始化程序中设置 Database.SetInitializer<DatabaseContext>(null);。 删除数据库中的表__MigrationHistory。对于 EF6+,该表位于 Tables 下,但对于早期版本,它位于 System Tables 下。 构建并运行。 利润。

【讨论】:

不幸的是,在执行了这些步骤之后,EF6 仍然在每次我的应用程序启动时检查__MigrationHistory 的存在,这使我的应用程序的启动时间增加了几毫秒。有没有办法完全禁用__MigrationHistory 检查?【参考方案3】:

将 Database.SetInitializer 设置为 null。

public class DatabaseContext: DbContext

    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    

【讨论】:

在上下文的实例构造函数上设置初始化器没有意义。如果您尝试创建新上下文,EF 将在实际访问该代码之前调用初始化程序。 刚刚通过查看 VS 2017 中的“诊断工具”验证了答案。在构造函数中将初始化程序设置为 null 后,第一个想要的 SQL 查询之前的 ADO.NET 调用已停止。 它按预期工作。确实 EF 之前会调用初始化程序,但随后在构造函数中再次调用它会使 DbContext 忽略迁移,以防您想忽略 __MigrationHistory 没有最新迁移的事实,而您没有无论如何都不想这样做。就我而言,我在开发环境中使用迁移,但是当我部署到生产环境时,我使用 SSDT 来更新数据库。因此,EF 会抱怨模型已更改,因为 __MigrationHistory 不会有最新的迁移,但我可以保证数据库已更新。 我建议将调用 Database.SetInitializer 从构造函数转移到类构造函数。这样可以确保只进行一次调用。【参考方案4】:

如果您已经使用过 Migrations,那么仅更改 Initializer 将无济于事。您需要转到 Management Studio,打开您的数据库表,转到 System Tables 文件夹并删除位于那里的 __MigrationHistory 表(对于 EF6 及更高版本,它位于 Tables 的正下方)。这将永久禁用迁移。

【讨论】:

表 __MigrationHistory 直接位于 Tables 下,而不是 System Tables。 @PeterHedberg 这对于 EF6+ 是正确的。对于早期版本,它位于System Tables 您也可以使用sp_rename 重命名表,而不是删除它。我还禁用了初始化程序。【参考方案5】:

如果您想完全关闭迁移:

https://***.com/a/9709407/141172

但是,我发现启用代码优先迁移会更好,但使用 -Script 选项让 EF 为我创建一个数据库更改脚本,我可以手动将其应用于每个数据库(开发、QA、生产):

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

这样 EF 将为我创建更改脚本,而我仍然可以完全控制正在应用的更改。我像任何其他源代码一样对更改脚本进行版本控制。

【讨论】:

您的链接并不真正对应于completely turn off migrations。为此:将Database.SetInitializer&lt;YourContextType&gt;(null) 添加到应用程序的启动中 知道如何使用 EF Core 实现这一目标吗? @Shimmy:EF Core 永远不应该自动尝试更改您的数据库。见github.com/dotnet/efcore/issues/3152

以上是关于如何禁用代码优先迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用从未启用的迁移

代码优先迁移 - 如何回滚第一次迁移

如何在 EF 代码优先中禁用链接表的级联删除?

基于代码的代码优先迁移

如何避免使用自动代码优先迁移重新创建现有数据库

实体框架 - 迁移 - 代码优先 - 每次迁移播种