Entity Framework Core如何正确定义外键?导航属性报错如何解决?
问题根源
- Fluent API配置存在拼写错误:你写的外键属性名
CategoyId、SubCategoyId均少了字母r,EF Core找不到对应实体属性,误将导航属性识别为普通字段触发报错。 - 关系配置逻辑错误:如果你的SubCategory表主键为单个全局唯一Id,不需要配置复合外键;如果SubCategory的Id为同分类下自增、全局不唯一(符合你给出的示例数据特征),你需要先为SubCategory配置复合主键,再配置对应复合外键。
- Category实体导航属性类型不匹配:
ICollection<HrCodeSubType>应为ICollection<SubCategory>,类型不匹配也会引发关系配置异常。
解决方法
情况1:SubCategory的Id为全局唯一(不符合你给出的示例数据特征)
- 修正Category类的导航属性:
public class Category { [Key] public int Id { get; set; } [Required] public string Name { get; set; } // 修正泛型类型 public virtual ICollection<SubCategory> SubCategories { get; set; } }
- 替换原有错误的Fluent API配置,也可以直接删除这段配置,数据注解已足够自动匹配关系:
builder.Entity<Item>() .HasOne(x => x.SubCategory) .WithMany() .HasForeignKey(x => x.SubCategoryId) .IsRequired(false);
情况2:SubCategory的Id为同分类下自增、全局不唯一(符合你给出的示例数据特征)
- 先修正Category类导航属性,同上。
- 先为SubCategory配置复合主键:
builder.Entity<SubCategory>() .HasKey(sc => new { sc.Id, sc.CategoryId });
- 替换原有错误的Fluent API配置,注意修正属性拼写:
builder.Entity<Item>() .HasOne(x => x.SubCategory) .WithMany() .HasForeignKey(x => new { x.CategoryId, x.SubCategoryId }) .IsRequired(false);
内容的提问来源于stack exchange,提问作者mohammed ali
相关产品推荐
相关产品推荐

