EF 7: come caricare entità correlate in una relazione uno a molti

asp.net asp.net-core c# entity-framework entity-framework-core

Domanda

Ho il codice seguente. Perché le mie proprietà di navigazione (Requisito in corso e Corsi in Requisito) sono nulle?

    public class Course : AbsEntity {
            [Key]
            public string Title { get; set; }
            public string Term { get; set; }
            public int Year { get; set; }
            public string CourseId { get; set; }        
            public double GradePercent { get; set; }        
            public string GradeLetter { get; set; }     
            public string Status { get; set; }
            public int ReqId { get; set; }

            public Requirement Requirement { get; set; }
        }

    public class Requirement : AbsEntity {
            [Key]
            public int ReqId { get; set; }
            public string ReqName { get; set; }

            public ICollection<Course> Courses { get; set; }
        }

// In DbContext
    protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Course>().HasOne(c => c.Requirement).WithMany(r => r.Courses).HasForeignKey(c => c.ReqId);
                modelBuilder.Entity<Requirement>().HasMany(r => r.Courses).WithOne(c => c.Requirement);
            }

Risposta accettata

La prima cosa è che non hai bisogno di configurare la tua relazione due volte, devi solo farlo una volta:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Course>().HasOne(c => c.Requirement)
                                .WithMany(r => r.Courses)
                                .HasForeignKey(c => c.ReqId);          
}

La seconda cosa è se si sta facendo una query e si prevede di caricare pigro le proprietà correlate, temo che non sarà possibile. EF 7 non supporta ancora il caricamento lazy . Come puoi vedere, c'è un articolo di backlog che tiene traccia di Lazy Loading. Quindi, se hai bisogno di caricare un'entità correlata, dovresti usare il caricamento esplicito usando il metodo Include :

 var query= ctx.Courses.Include(c=>c.Requirement).Where(...)...;


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché