停用迁移

时间:2016-04-18 10:37:40

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

我正在编写一个附加到我使用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);
}

&#34;类型&#39; System.NotSupportedException&#39;的例外情况发生在EntityFramework.dll中但未在用户代码中处理 附加信息:无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用Code First或Code First Migrations创建的数据库的模型兼容性。&#34;

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

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表),即使我已删除了迁移子文件夹。 作为新人,我不知道该往哪里去。我知道我已经创建了我的初始化程序,见上文,所以我错过了什么?

编辑 - 评论太长

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

很简单,我不知道在我的数据库中生成_MigrationHistory表是什么,如果从项目中删除Migration子目录并删除数据库,那么我认为这都是我需要做的是放弃迁移。

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

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

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

1 个答案:

答案 0 :(得分:0)

您的初始值设定项继承自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);
  }
}