gpt4 book ai didi

c# - EF 迁移生成一个迁移文件,其中包含不再存在的数据

转载 作者:行者123 更新时间:2023-11-30 12:21:31 24 4
gpt4 key购买 nike

我当时在一个 Spike 分支上,尝试使用 EF 迁移,一旦我得到了我想要的东西,就从头开始创建了实际的开发分支(基于之前没有任何 DB 或 ORM 相关代码的分支所有)。

新代码

我有一个从 DbContext 继承的上下文和这个 DbSet:

public DbSet<Warehouse> Warehouses { get; set; }

Warehouse 包含这个:

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,正在开发一个全新的分支和一个新的迁移。

并非完全出乎意料

不过,我确实有一个包含 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)
{
}
}

问题

What can I do to fix this (weird) behaviour?

最佳答案

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

enter image description here

我之前没有注意到这一点,因为只有在 update-database 上使用 -verbose 时才会看到它。除非出现问题(比如现在),否则我不会这样做。

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

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

...相当(恼人的)假设。我宁愿有一个错误。

关于c# - EF 迁移生成一个迁移文件,其中包含不再存在的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45501915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com