Entity framework 如何在Entity Framework 6.0中禁用迁移

Entity framework 如何在Entity Framework 6.0中禁用迁移,entity-framework,entity,entity-framework-migrations,Entity Framework,Entity,Entity Framework Migrations,我试图忽略使用EntityFramework6.0RC1的“自动”迁移。我的问题是,我现在不想要这个功能,每次我的应用程序运行时,我都能看到试图创建所有表的所有实体日志 期待感谢。试试以下方法: internal sealed class Configuration : DbMigrationsConfiguration<YourContext> { public Configuration() { AutomaticMigrationsEnabled

我试图忽略使用EntityFramework6.0RC1的“自动”迁移。我的问题是,我现在不想要这个功能,每次我的应用程序运行时,我都能看到试图创建所有表的所有实体日志

期待感谢。

试试以下方法:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=假;
}
}
更新:

您也可以尝试以下方法:

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

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

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


此msdn页面介绍了有关的所有信息

我犯的错误是调用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 });                            
}

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

enable-migrations -EnableAutomaticMigration:$false -ContextTypeName FullyQualifiedContextName
将创建一个
Configuration
类,该类将
AutomaticMigrationsEnabled
属性设置为false,如上面的答案所示


实体框架教程页面的文章中提到了
enable migrations
命令的
EnableAutomaticMigration
参数(但是他们将其与
true
一起使用,后者似乎是默认值)。

通过web.config,请参见-

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

公共类MyDB:DbContext
{
公共MyDB()
{
Database.SetInitializer(null);
}
}
或Global.asax.cs中的

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

        Database.SetInitializer<MyDB>(null);

        /// ...

    }
}
公共类MVCAPApplication:System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
// ...
Database.SetInitializer(null);
/// ...
}
}

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

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

static MyContext()
{
       System.Data.Entity.Database.SetInitializer<MyContext>(null);
}
static MyContext()
{
System.Data.Entity.Database.SetInitializer(null);
}


您是否尝试过使用
database.SetInitializer(null)
禁用数据库初始值设定项?请注意,如果您说“禁用自动迁移”,而不是基于代码的迁移,则标题会更准确。是的,现在它正在工作。我想我做错了什么。问题是我删除了我的_migrationhistory表和所有迁移文件。我做了Database.SetInitializer(新的NullDatabaseInitializer());和Database.SetInitializer(null)一样感谢guysGuys,我想我的问题不太清楚。我意识到我的问题是我有一个从DbContext继承的抽象基类,称为DefaultDbContext。问题是我使用了Database.SetInitializer(null),但正确的方法是Database.SetInitializer(null)。谢谢第一个答案似乎对我有用。我正在使用一个案例,其中我首先为一个我永远不会更改的现有数据库创建了带有代码的小模型。谢谢。一旦您启用了迁移(添加了配置类),这两个解决方案都不会阻止运行迁移。AutomaticMigrationsEnabled=false-禁用代码中没有迁移的自动迁移数据库。此外,我的期望是避免使用CreateDatabaseIfNotExists初始值设定项运行迁移。我预计EF将基于该模型创建一个数据库,而无需迁移。但是CreateDatabaseIfNotExists和MigratedDatabaseToLateStVersion在存在迁移的情况下的行为是相同的。请查看日志:这是一种永久禁用数据库初始化的更好方法。此页面介绍了实体框架配置部分的所有内容:what is
app.config
,你是说
web.config
?我如何确定什么是
YourAssemblyName
?App.config或web.config,无论你在使用什么YourAssemblyName'是拥有DbContext的程序集的名称。您可以右键单击项目并在“应用程序”选项卡下选中它。您必须将它放在“配置”下的“entityFramework”部分中。对于代码优先EF,这是最干净的答案。不要将它放在DbContext的构造函数中,您将它放在哪里?为什么不在构造函数中?(真正的问题,不是讽刺)@AaronSherman在创建
MyDB
之前,可以随时调用它,而不是将其放入构造函数中,例如在
应用程序启动()中调用它。它是一种静态方法,用于配置实体框架使用的初始值设定项,因此应该在创建
DbContext
之前调用它。我个人认为将
SetInitializer
添加到我的DbContext类的
静态构造函数中是最干净的方法。奇怪的是,您是如何获得
所有ContextTypes
的?也很好奇如何获得
static MyContext()
{
       System.Data.Entity.Database.SetInitializer<MyContext>(null);
}