【问题标题】:Disabling migrations禁用迁移
【发布时间】:2016-04-18 10:37:39
【问题描述】:

我正在编写一个附加到我使用 Model First 创建的数据库的 web api。

作为新手,我将 Model First 与 Code First 混淆了。

由于这是我的第一个 EF/Web 应用程序,我没有意识到 Model First 还没有实现迁移,我按照程序来实现它。当它运行时,我收到了一些错误,查看了它们,然后才意识到我需要再次删除它。

按照某人的指示,我删除了迁移文件夹以及数据库中的 _migrationHistory 表。

但是现在每当数据库中缺少 _migrationhistory 表时,我都会收到以下异常。

protected void Application_Start()
{
  // Call initializer
  Database.SetInitializer(new PulseDbInitializer());
  new ApplicationDbContext().Database.Initialize(true); <- error here

  AreaRegistration.RegisterAllAreas();
  GlobalConfiguration.Configure(WebApiConfig.Register);
  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  RouteConfig.RegisterRoutes(RouteTable.Routes);
  BundleConfig.RegisterBundles(BundleTable.Bundles);
}

“在 EntityFramework.dll 中发生了 'System.NotSupportedException' 类型的异常,但未在用户代码中处理 附加信息:无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用 Code First 或 Code First 迁移创建的数据库的模型兼容性。"

以下是我的初始化器的部分描述

public partial class PulseDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>, IPulseDbInit
//public partial class PulseDbInitializer :DropCreateDatabaseAlways<ApplicationDbContext>, IPulseDbInit
{
  private ApplicationDbContext _context;
  protected override void Seed(ApplicationDbContext context)
  {
    _context = context;
    var pid = new PulseDbInitializionData(context);
    pid.Init(this);
  }
}// class PulseDbInitializer

即使我删除了迁移子文件夹,该应用程序似乎也在尝试使用迁移(因为它正在创建 _migrationhistory 表)。 作为新手,我不知道该去哪里。我知道我已经创建了初始化程序,见上文,所以我错过了什么吗?

编辑 - 评论太长了

我不确定我们是否相互理解。

非常简单,如果我从项目中删除 Migration 子目录并删除数据库,我不知道是什么在我的数据库中生成 _MigrationHistory 表作为 afaik,然后我认为这就是我需要做的所有事情来删除迁移。

首先在我的模型中,DropCreateDatabaseIfModelChanges 是我一直用于生成数据库的,并且按预期工作。它创建一个新数据库,或在模型更改时重新创建。

在添加迁移之前,我没有注意到这个 _MigrationHistory 表,并且我不知道 add-migration 命令是否向我的项目中添加了我需要删除或更改的任何代码(我真的很讨厌发生的事情和没有被告知在某种日志中究竟做了什么。请微软,以备将来参考)

或者我完全错了,_MigrationHistory 表一直在那里,但我从未注意到?只要我不移除桌子,这一切似乎都有效。

【问题讨论】:

  • 您已注释掉的 DropCreateDatabaseAlways 应该可以工作。 stackoverflow.com/questions/29349443/…
  • @SteveGreene 是的,但这会在每次初始化时删除并重新创建数据库,不是吗?
  • 是的,运行一次然后切换回 DropCreateDatabaseIfModelChanges

标签: c# entity-framework entity-framework-migrations ef-model-first


【解决方案1】:

您的初始化程序继承自 DropCreateDatabaseIfModelChanges,它检查模型更改。由于您没有首先使用代码,因此您无法检查代码中的模型更改(因为您的代码没有定义模型-这将是代码优先-...模型定义了代码-即模型优先- )...所以您需要实现自己的IDatabaseInitializer,它只检查(例如)数据库是否存在:

public partial class PulseDbInitializer : IDatabaseInitializer<ApplicationDbContext>, IPulseDbInit
{
  public void InitializeDatabase(ApplicationDbContext context)
  {
    var exists = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext);
    if (exists == DatabaseExistenceState.Exists)
    {
       // maybe check if certain data exists and call the `Seed` method if
       // it doesn't
       return;
    }

    // Throw some error if it doesn't exist
  }

  protected override void Seed(ApplicationDbContext context)
  {
    _context = context;
    var pid = new PulseDbInitializionData(context);
    pid.Init(this);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2013-01-17
    相关资源
    最近更新 更多