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

ef6 code first,对已有数据库如何执行迁移

ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目

EF CodeFirst 通过代码生成数据库

vs2013, EF6.0.0.0 使用Migrations来更新数据库时报错

EF 数据迁移