EF Core (Code First) 一对多关系下数据种子(Seed)执行失败问题求助
问题解决方法
核心错误原因
EF Core 的 HasData 种子数据接口不支持直接设置实体的导航属性,只能通过显式赋值外键字段建立关联。你代码里两处不符合要求:
- 初始化
TblAnswerItem实例时传入了Question1导航属性对象,触发了 EF Core 的种子数据校验规则 - 手动向
Question1.AnswerList添加答案实例的操作对HasData无效,不需要写这部分逻辑
修正后的种子数据代码
你只需要修改 OnModelCreating 方法里的种子数据部分即可:
//Seed data TblQuestionItem Question1 = new TblQuestionItem(1, "Who is the CEO of SpaceX ?"); // 初始化答案时不要传入Question导航属性实例,只需要给FkQuestionID赋值对应问题的ID TblAnswerItem Answer1 = new TblAnswerItem(1, "Jeff Bezos", 1); TblAnswerItem Answer2 = new TblAnswerItem(2, "Elon Musk", 1); TblAnswerItem Answer3 = new TblAnswerItem(3, "Bill Gates", 1); TblAnswerItem Answer4 = new TblAnswerItem(4, "Sundar Pichai", 1); builder.Entity<TblQuestionItem>().HasData(Question1); builder.Entity<TblAnswerItem>().HasData(Answer1); builder.Entity<TblAnswerItem>().HasData(Answer2); builder.Entity<TblAnswerItem>().HasData(Answer3); builder.Entity<TblAnswerItem>().HasData(Answer4);
额外注意事项
如果你的 TblAnswerItem 构造函数强制要求传入 TblQuestionItem 类型参数,你可以调整构造函数,或者改用对象初始化器赋值,避免传入导航属性:
TblAnswerItem Answer1 = new TblAnswerItem(1, "Jeff Bezos", 1) { // 不要给Question导航属性赋值 };
内容的提问来源于stack exchange,提问作者Bluemarble
相关产品推荐
相关产品推荐

