如何禁用代码首次迁移

Sta*_*ove 80 migration entity-framework code-first

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

Sar*_*uri 93

将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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 在上下文的实例构造函数上设置初始化程序没有意义.如果您尝试创建新的上下文,EF将在实际获取该代码之前调用初始化程序. (2认同)
  • 它按预期工作。的确,EF会在之前调用初始化程序,但是在构造函数中再次调用它会使DbContext忽略迁移,以防万一您想忽略__MigrationHistory没有最新的迁移,而您却没有这样做。还是不想这么做。就我而言,我在开发环境中使用迁移,但是当我部署到生产环境时,我使用SSDT来更新数据库。因此,EF会抱怨模型已更改,因为__MigrationHistory没有最新的迁移,但是我可以保证数据库已更新。 (2认同)

kar*_*gen 39

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

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


Eri*_* J. 26

如果要完全关闭迁移:

/sf/answers/679658521/

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

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject
Run Code Online (Sandbox Code Playgroud)

这样EF就会为我创建更改脚本,而且我仍然可以完全控制所应用的更改.我像其他源代码一样对更改脚本进行版本控制.


Epi*_*dex 23

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

  • 表__MigrationHistory直接位于Tables,而不是System Tables. (7认同)
  • @PeterHedberg这适用于EF6 +.对于早期版本,它位于`System Tables`下. (6认同)
  • 您还可以使用“sp_rename”重命名该表,而不是删除它。我还禁用了初始化程序。 (2认同)