Sqlite的EntityFrameworkCore没有创建__EFMigrationHistory表

时间:2017-02-22 13:40:56

标签: sqlite uwp entity-framework-core

在我解释我的问题之前,我有一些实体框架5和6代码首次迁移的经验,运行add-migration / update-database以及来自Package Manager控制台的一些更具体的命令。所有迁移历史记录都在__MigrationHistory表中开箱即用。

我现在正在编写一个UWP应用并使用EntityFrameworkCore sqlite。该应用程序设置为支持新的迁移并正确执行。

应用迁移时,应用程序需要在安装和首次启动时自动推断(如果数据库是否存在)以及当前数据库迁移版本。然后,它可以应用相关的迁移过程,包括在需要时创建数据库。

目前,我尝试在启动时在我的DbContext中执行迁移:

public class MyContext : DbContext
{        
    public DbSet<SomeEntity> MyEntities { get; set; }

    static MyContext()
    {
        using(var db = new MyContext())
        {
            db.Database.Migrate();
        }
    }

这适用于首次启动时的新应用。但是,在第二次启动时,或者在添加新迁移之后,Migrate()方法失败,因为它尝试创建的表已经存在。

  
    

SQLite错误1:'table \“MyEntities \”已经存在'

  

此错误来自重新运行先前已应用的迁移。数据库本身需要像以前使用__EFMigrationHistory一样了解它的迁移历史记录。目前没有为我创建此表。

我怀疑我需要手动为此构建解决方案,可能会创建我自己的__MigrationHistory表并使其保持最新,正如此帖here

我想知道人们在这个问题上使用了什么解决方案,或者是否有任何开箱即用的东西让我感到愚蠢和缺失。

如果需要更多细节,请告诉我。

2 个答案:

答案 0 :(得分:0)

我以某种方式解决了这个问题,但我仍然不确定为什么__MigrationHistory表没有自动生成...

我无法找到其他人在UWP应用中遇到此问题的任何证据,因此很可能是项目特定的,并且是由解决方案的设置方式引起的。

无论如何,我所做的改变:

我创建了一个MigrationHistory模型,并将其作为DbSet添加到我的DbContext中。

模型

namespace MyApp.Shared.Models.Infrastructure
{
    public class MigrationHistory
    {
        public string MigrationId { get; set; }
        public string ProductVersion { get; set; }
    }
}

添加DbContext

public class MyContext : DbContext
{        

    public DbSet<MigrationHistory> __MigrationHistory { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        #region Primary Keys

        modelBuilder.Entity<MigrationHistory>().HasKey(mh => mh.MigrationId);

在此阶段,在运行add-migration时,实体框架尝试创建__MigrationHistory表。如果我运行我的应用程序,这将导致错误,因为应用迁移会导致错误:

  
    

SQLite错误1:'table \“__ MigrationHistory \”已经存在'

  

所以我将以下代码添加到MyContextModelSnapshot

modelBuilder.Entity("MyApp.Shared.Models.Infrastructure.MigrationHistory", b =>
{
    b.Property<string>("MigrationId")
        .ValueGeneratedOnAdd();

    b.Property<string>("ProductVersion");

    b.HasKey("MigrationId");

    b.ToTable("__MigrationHistory");
});

一旦它在快照中,它就可以保留在那里,它可以防止实体框架在将来的迁移过程中尝试添加该表。

启动时,我的应用程序现在运行

using (var db = new Assessment.Data.WindowsUniversal.AssessmentContext())
{
            db.MigrateDatabase();
}

它完美运行,查阅表格并在必要时应用迁移。

我觉得这是一个不存在的问题的解决方案,这是我自己制作的问题,但我会留在这里,以防它与其他人有关。

答案 1 :(得分:0)

据我所遇到的同样问题,我发现 debug 数据库(在\ bin \ Debug文件夹中)没有__EFMigrationsHistory表,而生产数据库(您的启动项目的根目录)具有它。

也许会对其他人有所帮助。