如何修复 Entity Framework Core 中 X 类型错误的“无法确定导航 X 表示的关系”

Posted

技术标签:

【中文标题】如何修复 Entity Framework Core 中 X 类型错误的“无法确定导航 X 表示的关系”【英文标题】:How to fix 'Unable to determine the relationship represented by navigation X' of type X error in Entity Framework Core 【发布时间】:2021-11-13 14:59:20 【问题描述】:

我正在使用 Entity Framework Core 开发一个 ASP.NET Core 5 项目。

我有这些实体

public class StudentTrainingMark

        public         int           Id               get; set; 
        public         decimal       TheoreticalMark  get; set; 
        public         decimal       PracticalMark    get; set; 
        public         string        Note             get; set; 

        public         string        BranchId         get; set; 
        public         byte          FormationYearId  get; set;  
        public         string        StudentId        get; set; 

        public virtual Branch        Branch           get; set; 
        public virtual FormationYear FormationYear    get; set; 
        public virtual Student       Student          get; set; 


public class Student
 
    public string Id          get; set; 
    public string FirstName   get; set; 
    public string FamilyName  get; set; 

    public virtual ICollection<StudentTrainingMark>   StudentTrainingMarks  get; set; 

我为每个实体创建了配置文件来执行一些配置,例如必填字段和关系。

所以StudentTrainingMark 也有这样的配置文件:

public class StudentTrainingMarkEntityConfig:IEntityTypeConfiguration<StudentTrainingMark>

    public void Configure( EntityTypeBuilder<StudentTrainingMark> builder )
    
        builder.HasKey( x => x.Id );
        builder.Property( x => x.Id ).UseIdentityColumn();

        builder.Property( x => x.TheoreticalMark ).IsRequired();
        builder.Property( x => x.PracticalMark ).IsRequired();

        builder.Property( x => x.BranchId ).IsRequired();
        builder.Property( x => x.FormationYearId ).IsRequired();
        builder.Property( x => x.StudentId ).IsRequired();
    

Student 也有这样的配置文件:

public class StudentEntityConfig:IEntityTypeConfiguration<Student>

    public void Configure( EntityTypeBuilder<Student> builder )
    
        builder.HasKey( x => x.Id );
        builder.Property( x => x.Id ).IsRequired();

        builder.Property( x => x.FirstName ).IsRequired();
        builder.Property( x => x.FamilyName ).IsRequired();
        builder.Property( x => x.BirthDate ).IsRequired();
        builder.Property( x => x.BirthPlace ).IsRequired();
        builder.Property( x => x.Gender ).IsRequired();
        builder.Property( x => x.Nationality ).IsRequired();
        builder.Property( x => x.Address ).IsRequired();
        builder.Property( x => x.DateOfRegistration ).IsRequired();
        builder.Property( x => x.AcademicYearOfRegistration ).IsRequired();
        builder.Property( x => x.StudentGuardianId ).IsRequired( false );

        builder.Property( x => x.StudyLevelId ).IsRequired();
        builder.Property( x => x.GroupId ).IsRequired();
    

究竟是什么问题?

当我尝试添加新迁移时,所有这些问题都出现了这个错误

无法确定“StudentTrainingMark”类型的导航“Student.TrainingMark”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

请 - 有关如何解决此问题的任何帮助?

【问题讨论】:

您的学生实体只有一个导航属性TrainingMarks。错误提到Student.TrainingMark。所以有些东西没有加起来。 您的另一个重复的question 刚刚关闭。以后不要多次打开同一个问题。 【参考方案1】:

你可以设置它们的关系:

modelBuilder.Entity<StudentTrainingMark>()
            .HasOne<Student>(s => s.Student)
            .WithMany(g => g.StudentTrainingMarks)
            .HasForeignKey(s => s.StudentId);

【讨论】:

以上是关于如何修复 Entity Framework Core 中 X 类型错误的“无法确定导航 X 表示的关系”的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 数据查询原理详解

Entity Framework 7 支持批量操作和 JSON 列

Entity Framework 学习系列 - 认识理解Entity Framework

如何使用Entity Framework仅更新一个字段?

C# Entity-Framework:如何在模型对象上组合 .Find 和 .Include?

Entity Framework 3.5 - 如何加载孩子