EF 迁移生成一个迁移文件,其中包含不再存在的数据
EF Migrations generates a migrations file with data that does not exist anymore
我在 Spike 分支上玩 EF 迁移,一旦我得到我想要的东西,就从头开始创建实际的开发分支(基于没有任何数据库或完全没有ORM相关代码).
新码
我有一个从 DbContext 继承的上下文和这个 DbSet:
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");
}
这完全不是我所期望的。
怎么了
所有这些重命名、更改列和删除列似乎表明迁移以某种方式确信它需要更新现有数据库中的现有 table。
但事实并非如此,因为我删除了旧的 localdb,正在处理一个全新的分支和新的迁移。
没有完全出乎意料
不过,我确实有一个仓库 class(在那个 Spike 分支中玩时),其中包含一个 ID、名称和缩写。
但那是旧闻了。并且不再存在。
我怀疑是怎么回事
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)
{
}
}
问题
What can I do to fix this (weird) behaviour?
我找到了。原因是这样的:
我之前没有注意到这一点,因为您只有在 update-database
上使用 -verbose
时才会看到它。除非出现问题(比如现在),否则我不会这样做。
这背后的原因是 运行,你需要有一个启动项目,在我的例子中是我的 REST API。由于它没有连接字符串(但有意),迁移 假设 我想使用我的 .\SQLEXPRESS
实例,而不是给出错误。
因为我也没有在我的 Spike 上提供连接字符串,所以我在没有注意到的情况下使用 SQLEXPRESS,现在正在检查旧的 table 定义,导致这些重命名和删除而不是干净的创建.
...相当(恼人的)假设。我宁愿有一个错误。
我在 Spike 分支上玩 EF 迁移,一旦我得到我想要的东西,就从头开始创建实际的开发分支(基于没有任何数据库或完全没有ORM相关代码).
新码
我有一个从 DbContext 继承的上下文和这个 DbSet:
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");
}
这完全不是我所期望的。
怎么了
所有这些重命名、更改列和删除列似乎表明迁移以某种方式确信它需要更新现有数据库中的现有 table。
但事实并非如此,因为我删除了旧的 localdb,正在处理一个全新的分支和新的迁移。
没有完全出乎意料
不过,我确实有一个仓库 class(在那个 Spike 分支中玩时),其中包含一个 ID、名称和缩写。
但那是旧闻了。并且不再存在。
我怀疑是怎么回事
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)
{
}
}
问题
What can I do to fix this (weird) behaviour?
我找到了。原因是这样的:
我之前没有注意到这一点,因为您只有在 update-database
上使用 -verbose
时才会看到它。除非出现问题(比如现在),否则我不会这样做。
这背后的原因是 运行,你需要有一个启动项目,在我的例子中是我的 REST API。由于它没有连接字符串(但有意),迁移 假设 我想使用我的 .\SQLEXPRESS
实例,而不是给出错误。
因为我也没有在我的 Spike 上提供连接字符串,所以我在没有注意到的情况下使用 SQLEXPRESS,现在正在检查旧的 table 定义,导致这些重命名和删除而不是干净的创建.
...相当(恼人的)假设。我宁愿有一个错误。