【问题标题】:How to load a navigation collection's properties for an entity object如何为实体对象加载导航集合的属性
【发布时间】:2021-05-10 11:31:31
【问题描述】:

我正在处理一个以.net 5Entity framework core 为目标的Asp,net core 5 项目。

我有这些实体:

学生:

[ Key ]                                          public string      Id                         { get; set; }
[ Required ]                                     public string      FirstName                  { get; set; }
[ Required ]                                     public string      FamilyName                 { get; set; }
[ Required ]                                     public DateTime    BirthDate                  { get; set; }
[ Required ]                                     public string      BirthPlace                 { get; set; }
[ Required ]                                     public Gender      Gender                     { get; set; }
[ Required ]                                     public Nationality Nationality                { get; set; }
[ Required ]                                     public string      Address                    { get; set; }
[ Required ]                                     public DateTime    DateOfRegistration         { get; set; }
[ Required ]                                     public int         StudyLevelId               { get; set; }
[ Required ] [ForeignKey( nameof(AcademicYear))] public string      AcademicYearOfRegistration { get; set; }
[ Required ]                                     public string      GroupId                    { get; set; }
[ Phone ]                                        public string      PhoneNumber                { get; set; }
[ EmailAddress ]                                 public string      Email                      { get; set; }

public string FullName          => $"{FirstName} {FamilyName}";
public string NationalId        { get; set; }
public string PassportId        { get; set; }
public string ResideneCardId    { get; set; }
public string StudentGuardianId { get; set; }
public byte[] Picture           { get; set; }


public virtual StudentGuadian                      StudentGuadian   { get; set; }
public virtual StudyLevel                          StudyLevel       { get; set; }
public virtual AcademicYear                        AcademicYear     { get; set; }
public virtual Group                               Group            { get; set; }
public virtual ICollection<StudentAbsence>         Absences         { get; set; }
public virtual ICollection<TestMark>               TestMarks        { get; set; }
public virtual ICollection<ExamMark>               ExamMarks        { get; set; }
public virtual ICollection<StudentPayment>         Payements        { get; set; }
public virtual ICollection<StudentMonthlyPayement> MonthlyPayements { get; set; }
public virtual StudentTrainingMark                 TrainingMark     { get; set; }
public virtual StudentProjectMark                  ProjectMark      { get; set; }
public virtual ICollection<StudentYearlyResult>    YearlyResults    { get; set; }
public virtual StudentDiplomaResult                DiplomaResult    { get; set; }

学生缺席:

 [ Key ] [ DatabaseGenerated( DatabaseGeneratedOption.Identity ) ] public int      Id              { get; set; }
        [ Required ]                                                      public DateTime AbsenceDate     { get; set; }
        [ Required ]                                                      public TimeSpan AbsenceTime     { get; set; }
        [ Required ]                                                      public bool     IsJustified     { get; set; }
        [ Required ]                                                      public string   StudentId       { get; set; }
        [ Required ]                                                      public string   SchoolSubjectId { get; set; }

        public byte[] DocOfJustify { get; set; }
        public string Note         { get; set; }
        public string Reason       { get; set; }


        public virtual Student       Student       { get; set; }
        public virtual SchoolSubject SchoolSubject { get; set; }

        public string   CreatedBy    { get; set; }
        public DateTime CreatedOn    { get; set; }
        public bool     IsEdited     { get; set; }
        public string   LastEditor   { get; set; }
        public DateTime LastEditDate { get; set; }

学科:

        [Key] 
        public string Id { get; set; }
        
        [Required]
        public string FullTitle { get; set; }

        [Required]
        public string Coefficient { get; set; }

        [Required]
        public byte NumberOfTests { get; set; }

        [Required]
        public SchoolSubjectStatus Status { get; set; }

        [Required]
        public string BrancheId { get; set; }

        [Required]
        public string SemesterId { get; set; }

        [Required]
        public byte FormationYearId { get; set; }


        public virtual Branche                          Branche              { get; set; }
        public virtual Semester                         Semester             { get; set; }
        public virtual FormationYear                    FormationYear        { get; set; }
        public virtual ICollection<PedagogicalSequence> PedagogicalSequences { get; set; }
        public virtual ICollection<StudentAbsence>      StudentAbsences      { get; set; }
        public virtual ICollection<Test>                Tests                { get; set; }
        public virtual ICollection<Exam>                Exams                { get; set; }
        public virtual ICollection<GroupProfSubject>    Professors           { get; set; }
        public virtual ICollection<ProfAbsence>         ProfAbsences         { get; set; }

形成年:

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public byte Id { get; set; }

        [Required]
        public string Title { get; set; }

        public virtual ICollection<SchoolSubject> SchoolSubjects { get; set; }

有什么问题?

在一个方法中,我得到一个student 对象,我加载了他所有的Absences,我还尝试加载Absence.SchoolSubject 属性(来自Absence)和Absence.SchoolSubject.FormationYear 属性(来自Absence) 但我收到一条错误消息,他总结说 Absence.SchoolSubjectAbsence.SchoolSubject.FormationYear 属性是 Null 并且未加载。

我尝试了什么:

                                      Context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;

                                      IQueryable<Student> query = Context.Set<Student>().Where( s => s.Id == pkValue );

                                      query.Include( s => s.Group ).Include( s => s.Group.Branche )
                                           .Include( s => s.Group.FormationYear )
                                           .Include( s => s.StudentGuadian ).Include( s => s.Absences )
                                           .Include( s => s.Absences.First().SchoolSubject )
                                           .Include( s => s.Absences.First().SchoolSubject.FormationYear )
                                           .Load();

                                      return query.FirstOrDefault();

ContextDbContext 对象。

我知道这不是为 Student 对象加载 Absence 嵌套导航属性的正确方法,请帮助解决此问题?

【问题讨论】:

    标签: c# asp.net-core entity-framework-core .net-5


    【解决方案1】:

    IQueryable 实现是不可变的,因此,您必须存储新的查询。 使用ThenInclude 进行集合导航。我还删除了不需要的包括:

    query = query
        .Include( s => s.Group.Branche )
        .Include( s => s.Group.FormationYear )
        .Include( s => s.StudentGuadian )
        .Include( s => s.Absences )
            .ThenInclude( s => s.SchoolSubject.FormationYear );
    
    return query.FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多