EF迁移生成包含不再存在的数据的迁移文件

时间:2017-08-04 08:31:56

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

我当时正在Spike分支上玩EF迁移,一旦我得到了我想要的东西,就从头开始创建了实际的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");
}

这完全不符合我的预期。

出了什么问题

所有这些重命名,更改列和删除列似乎表明迁移确信它需要更新现有数据库中的现有表。

但事实并非如此,因为我删除了旧的localdb,正在开发一个全新的分支和新的迁移。

并非完全出乎意料

然而,我确实有一个仓库类(当在Spike分支中玩游戏时)包含Id,Name和缩写。

但这是个老消息。并且不再存在。

我怀疑是什么

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)
    {
    }
}

问题

  

我该怎么做才能解决这个(奇怪的)行为?

1 个答案:

答案 0 :(得分:2)

我找到了。原因是:

enter image description here

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

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

由于我没有在我的Spike上提供连接字符串,我在没有注意到的情况下正在使用SQLEXPRESS,现在正在检查旧表定义,导致这些重命名和删除而不是干净的创建。

......相当(恼人)的假设。我本来希望有一个错误。