Questa è la struttura della tabella che ho:
#region Tables
public class WorkoutProfile
{
public WorkoutProfile()
{
WorkoutExercises = new List<WorkoutExercise>();
}
[Key]
public int ProfileId { get; set; }
public string Name { get; set; }
public int Sets { get; set; }
public int RestAfterSetInSeconds { get; set; }
public virtual User User { get; set; }
public virtual ICollection<WorkoutExercise> WorkoutExercises { get; set; }
}
public class WorkoutExercise
{
[Key]
public int WorkoutId { get; set; }
public virtual Exercise Exercise { get; set; }
public int Order { get; set; }
public int WorkoutTimeInSeconds { get; set; }
public int RestAfterInSeconds { get; set; }
}
public class Exercise
{
[Key]
public long ExerciseId { get; set; }
public string Title { get; set; }
public string Visualisation { get; set; }
public bool IsDefault { get; set; } // Is exersice should be included when user first registers
}
public class User
{
[Key]
public long UserId { get; set; }
public string Email { get; set; }
public DateTime Registered { get; set; }
}
#endregion Tables
Nella classe repository eseguo la seguente query linq:
return context
.WorkoutProfiles.Include(w => w.WorkoutExercises)
.Where(q => q.User.UserId == userId && q.ProfileId == profileId)
.FirstOrDefault();
e ricevo il buono e il vecchio "Riferimento oggetto non impostato su un'istanza di un oggetto". Quando si esamina il risultato, vedere che la proprietà Esercizi in WorkoutExercises è nulla.
Ecco come viene creato il database usando l'approccio code first:
Quindi, la domanda è: perché gli esercizi non sono inclusi nell'oggetto WorkoutExercises? Devo includerlo in qualche modo? Sto usando .NET Core 2
Ho trovato una soluzione seguendo questo post
Alterato il mio codice come segue:
var top = context
.Set<WorkoutProfile>()
.Where(q => q.ProfileId == profileId && q.User.UserId == userId)
.Include(q => q.WorkoutExercises)
.SingleOrDefault();
context
.Entry(top)
.Collection(e => e.WorkoutExercises)
.Query()
.OfType<WorkoutExercise>()
.Include(e => e.Exercise)
.Load();
E ha funzionato
La semplice risposta non sarebbe un caricamento pigro in EFCore. Non ancora rilasciato, ma se vuoi dilettarti con il codice alfa, è nel repository. In base alle tue lezioni non ci sono raccolte per esercizi in WorkoutExcercise.
Quindi è necessario ThenInclude(w => w.Exercises)
seguito alla clausola Include poiché EFCore non esegue il caricamento lazy.