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);
}
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(...)...;