如何禁用代码优先迁移
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<YourContextType>(null)
添加到应用程序的启动中
知道如何使用 EF Core 实现这一目标吗?
@Shimmy:EF Core 永远不应该自动尝试更改您的数据库。见github.com/dotnet/efcore/issues/3152以上是关于如何禁用代码优先迁移的主要内容,如果未能解决你的问题,请参考以下文章