【发布时间】:2013-01-17 05:21:28
【问题描述】:
我在 EF5 中有一个代码优先的实体模型。但我想手动管理数据库更改——我不希望 EF 修改我现有的数据库及其所有数据。但是当我在 EF 映射和数据库中进行并行更改时,EF 拒绝正常运行,告诉我需要先使用代码迁移。如何关闭此功能?
【问题讨论】:
标签: entity-framework migration code-first
我在 EF5 中有一个代码优先的实体模型。但我想手动管理数据库更改——我不希望 EF 修改我现有的数据库及其所有数据。但是当我在 EF 映射和数据库中进行并行更改时,EF 拒绝正常运行,告诉我需要先使用代码迁移。如何关闭此功能?
【问题讨论】:
标签: entity-framework migration code-first
我刚刚通过
解决了这个“问题”我的环境配置如下
1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0
【讨论】:
_MigrationHistory 表吗?
所以我找到的最完整的答案是:
Migrations 文件夹。 Database.SetInitializer<DatabaseContext>(null);。 __MigrationHistory。对于 EF6+,该表位于 Tables 下,但对于早期版本,它位于 System Tables 下。【讨论】:
__MigrationHistory 的存在,这使我的应用程序的启动时间增加了几毫秒。有没有办法完全禁用__MigrationHistory 检查?
将 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);
}
【讨论】:
__MigrationHistory 没有最新迁移的事实,而您没有无论如何都不想这样做。就我而言,我在开发环境中使用迁移,但是当我部署到生产环境时,我使用 SSDT 来更新数据库。因此,EF 会抱怨模型已更改,因为 __MigrationHistory 不会有最新的迁移,但我可以保证数据库已更新。
Database.SetInitializer 从构造函数转移到类构造函数。这样可以确保只进行一次调用。
如果您已经使用过 Migrations,那么仅更改 Initializer 将无济于事。您需要转到 Management Studio,打开您的数据库表,转到 System Tables 文件夹并删除位于那里的 __MigrationHistory 表(对于 EF6 及更高版本,它位于 Tables 的正下方)。这将永久禁用迁移。
【讨论】:
System Tables。
sp_rename 重命名表,而不是删除它。我还禁用了初始化程序。
如果您想完全关闭迁移:
https://stackoverflow.com/a/9709407/141172
但是,我发现启用代码优先迁移会更好,但使用 -Script 选项让 EF 为我创建一个数据库更改脚本,我可以手动将其应用于每个数据库(开发、QA、生产):
Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject
这样 EF 将为我创建更改脚本,而我仍然可以完全控制正在应用的更改。我像任何其他源代码一样对更改脚本进行版本控制。
【讨论】:
completely turn off migrations。为此:将Database.SetInitializer<YourContextType>(null) 添加到应用程序的启动中