EF Core Code-First执行Add-Migration时外键相关错误求助
问题与解决方案
触发错误
执行add-migration命令时弹出错误:
无法从实体类型'DataLayer.Models.QuizModel (Dictionary<string, object>)'中移除属性'quizType',因为它正被该实体类型上的外键{'quizType'}使用。必须先移除或重新定义所有包含的外键,才能移除该属性。
未移除任何属性,怀疑错误提示由模型映射冲突导致,实体模型代码如下:
原实体模型代码
QuizType类
namespace DataLayer.Models { public class QuizType { [Key] [Required] public int quizType { get; set; } [MaxLength(150)] public string QuizTitle { get; set; } public QuizModel quizModel { get; set; } } }
UserModel类
namespace DataLayer.Models { public class UserModel { [Key] [Required] public int UserID { get; set; } [Required] [MaxLength(300)] public string UserName { get; set; } [Required] [MaxLength(300)] public string Password { get; set; } [AllowNull] [MaxLength(150)] public string Role { get; set; } public ICollection<QuizModel> quizes { get; set; } } }
QuizModel类
namespace DataLayer.Models { public class QuizModel { [Key] [Required] public int QuizID { get; set; } [Required] [MaxLength(150)] public string QuizName { get; set; } [Required] [MaxLength(300)] public string Categories { get; set; } [Required] public int QuestionCount { get; set; } [Required] public int QuizType { get; set; } [ForeignKey("QuizType")] public QuizType quizType { get; set; } [Required] [ForeignKey("User")] public int UserID { get; set; } public UserModel User { get; set; } public ICollection<QuestionModel> Questions { get; set; } } }
QuestionModel类
namespace DataLayer.Models { public class QuestionModel { [Key] [Required] public int QuestionID { get; set; } [Required] [MaxLength(400)] public string QuestionText { get; set; } [Required] public int QuizType{ get; set; } [ForeignKey(name:"quiz")] public int QuizID { get; set; } public QuizModel quiz { get; set; } public AnswerModel Answer { get; set; } public ICollection<AnswerOption> Oprtions { get; set; } } }
AnswerModel和AnswerOption类
namespace DataLayer.Models { public class AnswerModel { [Key] [Required] public int AnswerID { get; set; } [Required] [MaxLength(300)] public string Answertxt { get; set; } [Required] [ForeignKey(name: "Question")] public int QuestionID { get; set; } public QuestionModel Question { get; set; } [Required] public bool AnswerValidation { get; set; } } public class AnswerOption { [Key] [Required] public int OptionID { get; set; } [Required] [MaxLength(300)] public string Optiontxt { get; set; } [Required] public bool answerValidation { get; set; } [Required] [ForeignKey(name: "questionModel")] public int QuestionID { get; set; } public QuestionModel questionModel { get; set; } } }
问题根源
- 命名冲突:
QuizModel中外键字段QuizType(大写)与导航属性quizType(小写)名称高度相似,EF Core映射时误判为属性移除操作。 - 主键命名违规:
QuizType实体主键quizType与导航属性同名,导致外键映射逻辑混乱。 - 冗余字段干扰:
QuestionModel中的QuizType字段未关联实体,属于冗余存储,干扰EF模型检测。
修复步骤
1. 修改QuizType实体主键命名
namespace DataLayer.Models { public class QuizType { [Key] [Required] // 重命名主键为QuizTypeId,避免与导航属性冲突 public int QuizTypeId { get; set; } [MaxLength(150)] public string QuizTitle { get; set; } public QuizModel quizModel { get; set; } } }
2. 修正QuizModel的外键映射
namespace DataLayer.Models { public class QuizModel { [Key] [Required] public int QuizID { get; set; } [Required] [MaxLength(150)] public string QuizName { get; set; } [Required] [MaxLength(300)] public string Categories { get; set; } [Required] public int QuestionCount { get; set; } // 外键字段改为QuizTypeId,对应QuizType实体主键 [Required] public int QuizTypeId { get; set; } // 明确指定外键关联字段 [ForeignKey("QuizTypeId")] public QuizType QuizType { get; set; } [Required] [ForeignKey("User")] public int UserID { get; set; } public UserModel User { get; set; } public ICollection<QuestionModel> Questions { get; set; } } }
3. 移除QuestionModel中的冗余字段
namespace DataLayer.Models { public class QuestionModel { [Key] [Required] public int QuestionID { get; set; } [Required] [MaxLength(400)] public string QuestionText { get; set; } // 移除冗余的QuizType字段,可通过关联的QuizModel获取该信息 // [Required] // public int QuizType{ get; set; } [ForeignKey("quiz")] public int QuizID { get; set; } public QuizModel quiz { get; set; } public AnswerModel Answer { get; set; } public ICollection<AnswerOption> Oprtions { get; set; } } }
4. 重新生成迁移
- 删除项目Migrations文件夹下的所有迁移文件
- 执行命令:
dotnet ef migrations add InitialCreate - 执行命令:
dotnet ef database update
内容的提问来源于stack exchange,提问作者محمد مهدی الماسی
相关产品推荐
相关产品推荐

