我当时正在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)
{
}
}
问题
我该怎么做才能解决这个(奇怪的)行为?
答案 0 :(得分:2)