EF Migrations 生成一个包含不再存在的数据的迁移文件
Posted
技术标签:
【中文标题】EF Migrations 生成一个包含不再存在的数据的迁移文件【英文标题】:EF Migrations generates a migrations file with data that does not exist anymore 【发布时间】:2017-08-04 08:31:56 【问题描述】:我在 Spike 分支上,正在玩 EF Migrations,一旦我得到了我想要的东西,就从头开始创建了实际的 dev 分支(基于以前没有任何 DB 或 ORM 相关代码的分支全部)。
新代码
我有一个使用这个 DbSet 从 DbContext 继承的上下文:
public DbSet<Warehouse> Warehouses get; set;
仓库包含这个:
public class Warehouse
public string Code get; set;
public string Name get; set;
迁移
如果我跑步
add-migration Warehouse
我得到一个名为 201708040819010_Warehouse.cs
的文件,其中包含以下内容:
public override void Up()
RenameTable(name: "dbo.Warehouses", newName: "Warehouse");
DropPrimaryKey("dbo.Warehouse");
AddColumn("dbo.Warehouse", "Code", c => c.String(nullable: false, maxLength: 128));
AlterColumn("dbo.Warehouse", "Name", c => c.String(maxLength: 100));
AddPrimaryKey("dbo.Warehouse", "Code");
CreateIndex("dbo.Warehouse", "Name", unique: true);
DropColumn("dbo.Warehouse", "Id");
DropColumn("dbo.Warehouse", "Abbreviation");
DropTable("dbo.People");
这完全不是我所期望的。
怎么了
所有这些重命名、更改列和删除列似乎表明 Migrations 以某种方式确信它需要更新现有数据库中的现有表。
但这不是真的,因为我删除了我的旧 localdb,正在开发一个全新的分支并进行新的迁移。
并非完全出乎意料
然而,我确实有一个包含 Id、名称和缩写的 Warehouse 类(在那个 Spike 分支中玩耍时)。
但那是旧闻了。并且不再物理存在。
我怀疑发生了什么
Visual Studio 是不是自己跳闸了,新迁移基于存储在它的临时文件夹中的信息。我根据this post 清理了看起来可能相关的内容,但没有任何积极影响。
更新
DbContext
public class MyDbContext : DbContext, IMyDbContext
public MyDbContext()
:base("MyDb")
Configuration.LazyLoadingEnabled = false;
Database.SetInitializer(new NullDatabaseInitializer<MyDbContext>());
public DbSet<Warehouse> Warehouses get; set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Configurations
.AddFromAssembly(Assembly.GetExecutingAssembly());
modelBuilder.Conventions
.AddFromAssembly(Assembly.GetExecutingAssembly());
EF 迁移配置
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
public Configuration()
AutomaticMigrationsEnabled = false;
protected override void Seed(MyDbContext context)
问题
我能做些什么来解决这个(奇怪的)行为?
【问题讨论】:
您是否正在针对另一个数据库生成迁移?由于生成迁移的数据存储在数据库内部,因此它自身在迁移历史表中。 @Darren:它是相同的 connstring,指向我之前删除的 localdb。 (我尝试选择不同的目录名称,没有区别) 能否发布您的 DbContext 类和 EF 迁移配置。 @Darren:已添加。 对,您能否将迁移文件夹中存在的 c# 与数据库中 _migrationhistory 表中存在的内容进行比较,并确保您的数据库和代码中有所有迁移。 【参考方案1】:我找到了。原因是这样的:
我之前没有注意到这一点,因为只有在 update-database
上使用 -verbose
时才会看到它。我不会这样做,除非某些东西不起作用(比如现在)。
这背后的原因是,要运行,你需要有一个启动项目,在我的例子中是我的 REST API。由于它没有连接字符串(但故意),而不是给出错误,迁移假设我想使用我的.\SQLEXPRESS
实例。
因为我也没有在我的 Spike 上提供连接字符串,所以我正在处理 SQLEXPRESS 而没有注意到,现在正在检查旧的表定义,导致这些重命名和删除而不是干净的创建。
... 相当(烦人的)假设。我宁愿出错。
【讨论】:
以上是关于EF Migrations 生成一个包含不再存在的数据的迁移文件的主要内容,如果未能解决你的问题,请参考以下文章
EF Code First Database Initializer和Migrations Confusion
ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目