Fre*_*idt 1 c# linq eager-loading .net-core
我的第一个问题 - 友善点:-)。
在下面的代码中,我尝试引用“Include(d)”实体(Schedules)来获取其 Name 属性。在 EF 6 中,“schedule”和“schedule_2”都返回正确的 Name 值。在 EF Core 中,“schedule”返回 NULL,“schedule_2”返回正确的 Name 值。
我不明白为什么我必须加载“时间表”列表。.Ininclude 是否不应该强制为每个选举强制加载时间表,以便每个选举时间表的名称属性可用于“时间表”分配?
// Relevant Model entities in database
// DbSet<Election> Elections { get; set; }
//
// The following are the related classes defined in the database context...
public class Election
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Schedule> Schedules { get; set; }
}
public class Schedule
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public int? CfsElectionId { get; set; }
public string Name { get; set; }
[Required] // sets cascade delete
[ForeignKey("CFSElectionID")]
public virtual Election Election { get; set; }
}
class Program
{
static void Main()
{
var db = new FfmsDbContext();
var elections = db.Elections
.Include(i => i.Schedules)
.ToList();
//The following returns NULL?
var schedule = elections.First().Schedules?.First().Name ?? "NULL";
var schedules = db.Schedules
.ToList();
//The following returns the correct Name property?
var schedule_2 = elections.First().Schedules?.First().Name ?? "NULL";
Console.WriteLine($@"sched: {schedule}");
Console.WriteLine($@"schedules.First().Name: {schedules.First().Name}");
Console.WriteLine($@"sched2: {schedule_2}");
Console.WriteLine("Done...");
Console.ReadLine();
}
}
/*
Output...
sched: NULL
schedules.First().Name: Candidates
sched2: Candidates
Done...
*/
Run Code Online (Sandbox Code Playgroud)
事实证明,我的问题最终出现在课程的参考文献中。
我无意中选择了System.Data.Entity.Inclusion 作为提供的选择。
正确的参考应该是Microsoft.EntityFrameworkCore.
一旦我调整了参考,就.Include按预期工作了。