Entity Framework Core创建新迁移时残留旧数据问题求助
问题描述
我使用Entity Framework Core结合ASP.NET Core MVC,采用Code-First方式搭建站点与数据库的连接,整体运行正常。但目前遇到棘手问题:即使删除了整个迁移文件夹和数据库,创建新迁移时似乎仍有旧数据被缓存并使用,导致多种错误。例如报错:
The seed entity for entity type 'ResourceField' cannot be added because no value was provided for the required property 'ResourceFieldDataLevel'
该报错看似合理,因为我的ResourceField种子数据中确实没有ResourceFieldDataLevel字段:
modelBuilder.Entity<ResourceField>().HasData( new ResourceField { ResourceFieldId = 1, Level = 1, VillageId = 1, TypeOfResource = ResourceFieldType.Clay },
但实际上ResourceField类也根本不存在该属性:
public class ResourceField { public ResourceField() { } [Key] public int ResourceFieldId { get; set; } public ResourceFieldType TypeOfResource { get; set; } public int VillageId { get; set; } public virtual Village Village { get; set; } public int Level { get; set; } }
此前我曾测试功能,添加并移除过该属性,但EF似乎无法彻底清除旧迁移信息,一直使用已不存在的内容。我已删除迁移文件夹和数据库,执行dotnet ef migrations add InitialCreate后仍报错,尝试批量清理构建也无效。请问如何让Entity Framework Core彻底清除历史信息,基于当前代码重新开始?
解决步骤
1. 清理项目构建输出
- 手动删除项目根目录下的
bin和obj文件夹,这两个目录会残留编译后的旧实体类、迁移缓存等文件。 - 或者通过命令行执行:
dotnet clean,确保构建输出被完全清理。
2. 彻底删除目标数据库
- 若使用本地SQL Server:打开SQL Server Management Studio,找到目标数据库右键删除,勾选关闭现有连接选项,避免删除失败。
- 若使用SQLite:直接删除对应的
.db文件。 - 其他数据库类型,确保数据库实例、对应的架构数据被完全移除,无残留。
3. 清除EF Core设计时缓存
EF Core在设计时会生成缓存文件,存储在用户目录的NuGet缓存区域,路径示例(不同EF版本、系统会有差异):C:\Users\{你的用户名}\.nuget\packages\microsoft.entityframeworkcore.design\{EF版本号}\tools\netcoreapp3.1\win-x64\DesignTimeHost
- 找到该目录下的缓存文件夹或相关文件,直接删除即可。
4. 重新生成项目并创建迁移
- 执行
dotnet build编译项目,确保当前实体类、DbContext代码无编译错误。 - 执行
dotnet ef migrations add InitialCreate,此时会基于当前代码生成全新的迁移文件。 - 最后执行
dotnet ef database update,创建全新的数据库。
额外检查项
- 检查
DbContext的OnModelCreating方法,确认没有残留的旧配置代码(比如之前针对ResourceFieldDataLevel的配置)。 - 若使用版本控制,确保本地工作区的实体类、DbContext文件是最新的,没有未合并的旧代码残留。
内容的提问来源于stack exchange,提问作者linkedby

