如何禁用代码优先迁移


85

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


Answers:


100

将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);
    }

2
在上下文的实例构造函数上设置初始化程序没有任何意义。如果尝试创建新的上下文,EF会在实际获取该代码之前调用初始化程序。
Jcl

1
只需通过查看VS 2017中的“诊断工具”来验证答案。在将构造函数中的初始化器设置为null后,在第一个所需的SQL查询停止之前的ADO.NET调用。
卡尔

2
它按预期工作。的确,EF会在之前调用初始化程序,但随后在构造函数中再次调用它会使DbContext忽略迁移,以防您不想忽略__MigrationHistory没有最新迁移的事实,并且您不想无论如何都要做。就我而言,我在开发环境中使用迁移,但是当我部署到生产环境时,我使用SSDT来更新数据库。因此,EF会抱怨模型已更改,因为它__MigrationHistory没有最新的迁移,但我可以保证数据库已更新。
Alisson

我建议将调用Database.SetInitializer从构造函数移到类构造函数。这样可以确保仅进行一次呼叫。
史蒂文

40

因此,我找到的最完整的答案是:

  1. 删除Migrations项目内的文件夹。
  2. Database.SetInitializer<DatabaseContext>(null);在您的DatabaseContext初始化程序中进行设置。
  3. 删除__MigrationHistory数据库中的表。对于EF6 +,该表位于下方,Tables而对于早期版本,该表位于下方System Tables
  4. 生成并运行。
  5. 利润。

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

27

如果要完全关闭迁移:

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

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

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

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


1
您的链接并不真正对应completely turn off migrations。为此,请执行以下操作:添加Database.SetInitializer<YourContextType>(null)到应用程序的启动中
Don Cheadle 2015年

知道如何使用EF Core实现这一目标吗?
Shimmy Weitzhandler,

@Shimmy:EF Core永远不要自动尝试更改您的数据库。见github.com/dotnet/efcore/issues/3152
Eric

26

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


7
__MigrationHistory表位于表而不是系统表的正下方。
彼得·赫德伯格

6
@PeterHedberg这对于EF6 +是正确的。对于较早的版本,它位于下System Tables
Episodex

1
您还可以使用来重命名表,而不是删除表sp_rename。我也禁用了初始化程序。
NMrt

2

我刚刚解决了这个“问题”

  1. 从数据库中删除表“ _MigrationHistory”。
  2. 从项目中删除“迁移”文件夹。
  3. 更新EDMX文件。
  4. 清理项目并重建它。

我的环境的配置如下

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文件中更新了什么?我也在使用数据库优先,它仍在查询不存在的迁移表...谢谢!
dalcam '18

如果以后我们需要迁移怎么办,它会_MigrationHistory自动创建新 表吗?
sairfan,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.