在我解释我的问题之前,我有一些实体框架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
我想知道人们在这个问题上使用了什么解决方案,或者是否有任何开箱即用的东西让我感到愚蠢和缺失。
如果需要更多细节,请告诉我。
答案 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表,而生产数据库(您的启动项目的根目录)具有它。
也许会对其他人有所帮助。