如何在Entity Framework 6.0中禁用迁移


71

我试图忽略使用Entity Framework 6.0 rc1的“自动”迁移。我的问题是我现在不想要此功能,并且每次我的应用程序运行时,我都可以看到所有试图创建所有表的实体日志。

期待感谢。


11
您是否尝试通过使用禁用数据库初始化程序Database.SetInitializer<TContext>(null)
Pawel

2
事后注意,但如果您说“禁用自动迁移”,而不是基于代码的迁移,则标题会更准确
Savage

Answers:


50

尝试这个:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}

更新:

您也可以尝试以下操作:

Database.SetInitializer<YourContextType>(new CreateDatabaseIfNotExists());

2
是的,现在可以了。我想我做错了什么。问题是我删除了__migratioHistory表和所有迁移文件。我做了Database.SetInitializer(new NullDatabaseInitializer <EfContext>()); 与Database.SetInitializer <TContext>(null)相同谢谢你们
Michel Borges 2013年

2
伙计们,我想我不清楚我的问题。我意识到我的问题是我有一个继承自DbContext的抽象基类,称为DefaultDbContext。问题是我做了Database.SetInitializer <DefaultDbContext>(null),但是正确的方法是Database.SetInitializer <ConcretClassA>(null)。谢谢!
Michel Borges

第一个答案似乎对我有用。我正在使用我用Code First为我永远不会更改的现有数据库制作小型模型的情况。谢谢。
Wade Hatler 2014年

1
一旦启用了迁移(添加了Configuration类),这两种解决方案都不会阻止运行迁移。AutomaticMigrationsEnabled = false-禁用代码中没有迁移的自动迁移数据库。此外,我的期望是避免使用CreateDatabaseIfNotExExists初始化程序运行迁移。我希望EF能够在没有迁移的情况下基于该模型创建数据库。但是,如果存在迁移,则CreateDatabaseIfNotExists和MigrateDatabaseToLatestVersion的行为均相同。
谢尔盖G.16年


50

您可以将其放在app.config的entityFramework部分中:

<contexts>
  <context type="YourNamespace.YourDbContext, YourAssemblyName" disableDatabaseInitialization="true"/>
</contexts>

该msdn页介绍了有关“实体框架配置”部分的所有信息。


1
这是永久禁用数据库初始化的更好的方法
Tom Halladay 2015年

5
此页面介绍了有关“实体框架配置”部分的所有内容:msdn.microsoft.com/zh-cn/data/jj556606
KevinVictor

1
什么app.config意思web.config
Muflix

1
我如何确定是什么YourAssemblyName
Muflix

1
App.config或Web.config,无论使用什么。“ YourAssemblyName”是您拥有DbContext的程序集的名称。您可以右键单击该项目,然后在“应用程序”选项卡下进行检查。您必须将其放在“配置”下的“ entityFramework”部分中。
卡洛斯·特谢拉

29

通过web.config参见-https: //msdn.microsoft.com/zh-cn/data/jj556606.aspx#Initializers

通过代码(奇怪的是,MUCH答案更简单)

public class MyDB : DbContext
{
    public MyDB()
    {
        Database.SetInitializer<MyDB>(null);
    }
}

在Global.asax.cs中

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // ...

        Database.SetInitializer<MyDB>(null);

        /// ...

    }
}

2
对于Code First EF,这是最干净的答案。
Brain2000 '16

2
不要将其放入DbContext
Issa Fram

3
你会放在哪里?为什么不在构造函数中?(真正的问题,不是讽刺)
亚伦·谢尔曼

1
@AaronSherman无需将其放入构造函数中,而可以在创建之前的任何时候调用它MyDB,例如in中Application_Start()。这是用于配置Entity Framework使用的初始化程序的静态方法,因此应在DbContext创建之前调用它。
DigitalDan

1
@MuflixDatabaseSystem.Data.Entity名称空间中。
DigitalDan

4

如果您发现此问题是因为您键入“ Enable-Migrations”而希望获得一个简单的禁用迁移的答案,而现在事情却没有按预期的方式进行,例如没有运行您认为会运行的种子方法,请查看解决方案资源管理器并删除“迁移”文件夹。这将阻止代码查看迁移配置以查找初始化代码。要找回Migrations文件夹,只需再次运行“启用迁移”。


您也可以运行Enable-Migrations -Force
Fernando Torres

3

我犯的错误是调用Database.SetInitializer(null); 为时已晚(在初始化上下文之后)。确保禁用迁移的最佳方法是在应用程序启动时对所有上下文进行上述调用。与在app.config中进行设置相比,我更喜欢这种方法,因此我可以使用容器定位上下文,然后构造一个调用。

var migrationsMethod = typeof(System.Data.Entity.Database).GetMethod("SetInitializer");
foreach (var contextType in allContextTypes)
{
    migrationsMethod.MakeGenericMethod(contextType).Invoke(null, new object[] { null });                            
}

很好奇,你allContextTypes好吗?
Issa Fram,2016年

也很好奇您如何查询所有上下文
Katit

1

也可以使用值为的参数在调用enable-migrations命令(创建Configuration类)期间配置禁用自动迁移:EnableAutomaticMigrationfalse

enable-migrations -EnableAutomaticMigration:$false -ContextTypeName FullyQualifiedContextName

会创建一个ConfigurationAutomaticMigrationsEnabled属性设置为false的类,就像上面的答案一样。


EnableAutomaticMigration该参数enable-migrations的命令中提及文章的实体框架教程页面(但是他们用它来与true这似乎是默认值)。


默认情况下,今天的EnableAutomaticMigration始终为false
Fernando Torres

自动迁移的目的是什么?似乎每个人都讨厌他们
费尔南多·托雷斯

此部分的示例-ContextTypeName FullyQualifiedContextName
Fernando Torres

0

尝试此操作,在MyContext类中添加此行,这将在调用MyContext构造函数之前被调用。这将停止创建数据库,也不会将表添加到连接的数据库中。基本上,此行禁用默认的代码优先数据库初始化策略,该策略基本上具有默认策略,如CreateDatabaseIfNotExists。

static MyContext()
{
       System.Data.Entity.Database.SetInitializer<MyContext>(null);
}
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.