DotNet Core项目EF执行迁移失败:提示已存在名为Genres的对象
EF Core 迁移重复建表与导航配置问题排查
导航属性配置问题
- Genre与Movie的多对多导航配置符合EF Core 5及以上版本的隐式多对多规则,语法无错误;若使用EF Core 3.x及更低版本,需额外显式配置多对多中间表。
- Review类缺少User对应的外键属性,仅保留User导航属性会导致EF自动生成的外键字段不符合预期,需补全
public int UserId { get; set; }属性。 - 迁移日志中生成的Genres表主键为
Id,但当前Genre类定义的主键为GenreId,说明模型修改后未与迁移快照同步,存在配置不一致问题。
报错根本诱因
- 项目迁移记录已损坏:要么是手动删除了早于
20210514094730_initial的迁移文件,要么是数据库中__EFMigrationsHistory系统表的记录被清空或篡改,导致EF无法识别Genres表为已创建状态,会重新执行初始建表逻辑。 - 生成迁移时未正确比对现有数据库状态:修改模型后生成的迁移脚本错误包含了已存在表的创建逻辑,执行更新时就会触发重复建表报错。
修复方案
- 首先补全模型配置:
public class Review { [Key] public int ReviewId { get; set; } // 原有Rating相关属性省略 public int goreRating { get; set; } public int shockRating { get; set; } public int jumpRating { get; set; } public int plotRating { get; set; } public int supernaturalRating { get; set; } public int starRating { get; set; } public int MovieId { get; set; } // 补全User外键属性 public int UserId { get; set; } public User User { get; set; } public virtual Movie Movie { get; set; } }
- 修复损坏的迁移记录:
- 若无需保留历史迁移记录,直接删除项目Migrations文件夹下的所有文件,执行
Add-Migration ResetInitial生成新的初始迁移。 - 打开新生成的迁移文件,清空
Up方法内的所有建表逻辑,仅保留空方法体,执行Update-Database,EF会将当前迁移记录写入系统表,后续迁移会从当前数据库状态开始比对,不会再尝试重建已存在的表。 - 若需保留历史迁移记录,检查数据库
__EFMigrationsHistory表,手动插入20210514094730_initial的迁移记录即可跳过该初始迁移的执行。
内容的提问来源于stack exchange,提问作者Mr_Happy
相关产品推荐
相关产品推荐

