【问题标题】:EF Migrations generates a migrations file with data that does not exist anymoreEF Migrations 生成一个包含不再存在的数据的迁移文件
【发布时间】: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 表中存在的内容进行比较,并确保您的数据库和代码中有所有迁移。

标签: c# .net entity-framework visual-studio-2015 entity-framework-migrations


【解决方案1】:

我找到了。原因是这样的:

我之前没有注意到这一点,因为只有在 update-database 上使用 -verbose 时才会看到它。我不会这样做,除非某些东西不起作用(比如现在)。

这背后的原因是,要运行,你需要有一个启动项目,在我的例子中是我的 REST API。由于它没有连接字符串(但故意),而不是给出错误,迁移假设我想使用我的.\SQLEXPRESS 实例。

因为我也没有在我的 Spike 上提供连接字符串,所以我正在处理 SQLEXPRESS 而没有注意到,现在正在检查旧的表定义,导致这些重命名和删除而不是干净的创建。

... 相当(烦人的)假设。我宁愿出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2019-11-20
    • 2015-04-01
    • 2023-03-09
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多