【问题标题】:How can I disable migration in Entity Framework 6.0如何在 Entity Framework 6.0 中禁用迁移
【发布时间】:2013-09-11 02:36:25
【问题描述】:

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

期待感谢。

【问题讨论】:

  • 您是否尝试过使用Database.SetInitializer<TContext>(null) 禁用数据库初始化程序?
  • 迟到的注释,但如果您说“禁用自动迁移”,而不是基于代码的迁移,标题会更准确

标签: entity-framework entity entity-framework-migrations


【解决方案1】:

试试这个:

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

更新:

你也可以试试这个:

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

【讨论】:

  • 是的,现在它正在工作。我想我做错了什么。问题是我删除了我的 __migratioHistory 表和所有迁移文件。我做了 Database.SetInitializer(new NullDatabaseInitializer());与 Database.SetInitializer(null) 相同,谢谢大家
  • 伙计们,我想我的问题并不清楚。我意识到我的问题是我有一个继承自 DbContext 的抽象基类,称为 DefaultDbContext。问题是我做了 Database.SetInitializer(null),但正确的方法是 Database.SetInitializer(null)。谢谢!
  • 第一个答案似乎对我有用。我正在使用一个案例,我使用 Code First 为我永远不会更改的现有数据库制作小型模型。谢谢。
  • 一旦您启用了迁移(添加了配置类),这两个解决方案都不会阻止运行迁移。 AutomaticMigrationsEnabled = false - 禁用代码中没有迁移的自动迁移数据库。此外,我的期望是避免使用 CreateDatabaseIfNotExists 初始化程序运行迁移。我希望 EF 将基于没有迁移的模型创建一个数据库。但是在存在迁移的情况下,CreateDatabaseIfNotExists 和 MigrateDatabaseToLatestVersion 的行为方式相同。
【解决方案2】:

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

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

此 msdn 页面介绍了有关 Entity Framework Configuration Section 的所有信息。

【讨论】:

  • 这是永久禁用数据库初始化的更好方法
  • 此页面讲述了实体框架配置部分的所有信息:msdn.microsoft.com/en-us/data/jj556606
  • 什么是app.config,你的意思是web.config
  • 我如何确定YourAssemblyName 是什么?
  • App.config 或 Web.config,无论您使用什么。 “YourAssemblyName”是您拥有 DbContext 的程序集的名称。您可以右键单击该项目并在“应用程序”选项卡下检查它。您必须将其放在“配置”下的“实体框架”部分中。
【解决方案3】:

通过 web.config 查看 - https://msdn.microsoft.com/en-us/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);

        /// ...

    }
}

【讨论】:

  • 对于 Code First EF,这是最简洁的答案。
  • 不要把它放在DbContext的构造函数中
  • 你会把它放在哪里?为什么不在构造函数中? (真正的问题,不是讽刺)
  • @AaronSherman 可以在创建 MyDB 之前随时调用它,而不是将其放入构造函数中,例如在Application_Start()。它是用于配置实体框架使用的初始化程序的静态方法,因此应在创建DbContext 之前调用它。
  • 就我个人而言,我发现将SetInitializer 添加到我的 DbContext 类的static constructor 是最简洁的方法。
【解决方案4】:

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

【讨论】:

  • 你也可以运行 Enable-Migrations -Force
【解决方案5】:

我犯的错误是调用 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的?
  • 也很好奇如何查询所有上下文
【解决方案6】:

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

enable-migrations -EnableAutomaticMigration:$false -ContextTypeName FullyQualifiedContextName

这将创建一个 Configuration 类,将 AutomaticMigrationsEnabled 属性设置为 false,就像上面的答案一样。


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

【讨论】:

  • EnableAutomaticMigration 今天总是默认为假
  • 自动迁移的目的是什么?似乎每个人都讨厌他们
  • 这部分的一个例子-ContextTypeNamefullyQualifiedContextName
【解决方案7】:

试试这个,在你的 MyContext 类中添加这一行,这将在你的 MyContext 构造函数被调用之前被调用。这将停止创建数据库,也不会将表添加到连接的数据库中。基本上,这一行禁用了默认的 Code-First 数据库初始化策略,该策略基本上具有 CreateDatabaseIfNotExists 的默认策略。

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

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2017-10-27
    相关资源
    最近更新 更多