导航属性未加载 - 急切加载
Navigation properties not loading - eager Loading
我对 Entity Framework 没有什么经验。我正在尝试使用 Eager Loading,但似乎我做错了什么。
虽然我在查询中使用了 "include",但部门 class 的导航 属性 "Subjects" 没有加载。
下面是2个POCO、DBContext和Main方法。
输出只是部门的标题("Computer Science"),而不是显示相关主题("Java","C#","C++")。
public class Department
{
public Department()
{
Subjects = new HashSet<Subject>();
}
public int ID { get; set; }
public string Title { get; set; }
public ICollection<Subject> Subjects { get; set; }
}
public class Subject
{
public Subject()
{
aDepartment = new Department();
}
public int ID { get; set; }
public string Title { get; set; }
public int DepartmentID { get; set; }
public Department aDepartment { get; set; }
}
public class ModelDB : DbContext
{
public ModelDB() : base("name=ModelDB")
{
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = true;
}
public DbSet<Department> Departments { get; set; }
public DbSet<Subject> Subjects { get; set; }
}
static void Main(string[] args)
{
ModelDB db = new ModelDB();
/*
Department dep = new Department() { ID = 1, Title = "Computer Science" };
db.Departments.Add(dep);
db.SaveChanges();
Subject s1 = new Subject() { ID=1, Title="Java", aDepartment = dep };
db.Subjects.Add(s1);
db.SaveChanges();
Subject s2 = new Subject() { ID = 2, Title = "C#", aDepartment = dep };
db.Subjects.Add(s2);
db.SaveChanges();
Subject s3 = new Subject() { ID = 3, Title = "C++", aDepartment=dep };
db.Subjects.Add(s3);
db.SaveChanges();
*/
var lstDepartments = db.Departments.Include("Subjects");
foreach (var d in lstDepartments)
{
Console.WriteLine(d.Title);
var ss = d.Subjects;
foreach(var s in ss)
{
Console.WriteLine(s.Title);
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
主要问题是您正在初始化 reference 导航 属性 (aDepartment = new Department();
),这会混淆 EF 基础结构并阻止其正常工作。初始化 collection 导航属性是可以的(虽然不是强制性的),但永远不要为 reference 导航属性这样做。
从 Subject
构造函数中删除上述行将解决此问题。此外,尽管它以某种方式适用于您的情况(令我感到惊讶),但最好遵循命名约定并且不要调用导航 属性 aDepartment
,而只是 Department
与 DepartmentID
FK 属性.
这是 Subject
实体的更正工作版本:
public class Subject
{
public int ID { get; set; }
public string Title { get; set; }
public int DepartmentID { get; set; }
public Department Department { get; set; }
}
我觉得你可能没有告诉 EF 外键是什么。告诉 EF 这个 link 的映射 class 在哪里?如果您没有这个,请在主题上的部门导航 属性 上方添加 [ForeignKey("DepartmentID")] 属性,看看是否可以解决您的问题,新部门是否。 :)
我对 Entity Framework 没有什么经验。我正在尝试使用 Eager Loading,但似乎我做错了什么。
虽然我在查询中使用了 "include",但部门 class 的导航 属性 "Subjects" 没有加载。
下面是2个POCO、DBContext和Main方法。
输出只是部门的标题("Computer Science"),而不是显示相关主题("Java","C#","C++")。
public class Department
{
public Department()
{
Subjects = new HashSet<Subject>();
}
public int ID { get; set; }
public string Title { get; set; }
public ICollection<Subject> Subjects { get; set; }
}
public class Subject
{
public Subject()
{
aDepartment = new Department();
}
public int ID { get; set; }
public string Title { get; set; }
public int DepartmentID { get; set; }
public Department aDepartment { get; set; }
}
public class ModelDB : DbContext
{
public ModelDB() : base("name=ModelDB")
{
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = true;
}
public DbSet<Department> Departments { get; set; }
public DbSet<Subject> Subjects { get; set; }
}
static void Main(string[] args)
{
ModelDB db = new ModelDB();
/*
Department dep = new Department() { ID = 1, Title = "Computer Science" };
db.Departments.Add(dep);
db.SaveChanges();
Subject s1 = new Subject() { ID=1, Title="Java", aDepartment = dep };
db.Subjects.Add(s1);
db.SaveChanges();
Subject s2 = new Subject() { ID = 2, Title = "C#", aDepartment = dep };
db.Subjects.Add(s2);
db.SaveChanges();
Subject s3 = new Subject() { ID = 3, Title = "C++", aDepartment=dep };
db.Subjects.Add(s3);
db.SaveChanges();
*/
var lstDepartments = db.Departments.Include("Subjects");
foreach (var d in lstDepartments)
{
Console.WriteLine(d.Title);
var ss = d.Subjects;
foreach(var s in ss)
{
Console.WriteLine(s.Title);
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
主要问题是您正在初始化 reference 导航 属性 (aDepartment = new Department();
),这会混淆 EF 基础结构并阻止其正常工作。初始化 collection 导航属性是可以的(虽然不是强制性的),但永远不要为 reference 导航属性这样做。
从 Subject
构造函数中删除上述行将解决此问题。此外,尽管它以某种方式适用于您的情况(令我感到惊讶),但最好遵循命名约定并且不要调用导航 属性 aDepartment
,而只是 Department
与 DepartmentID
FK 属性.
这是 Subject
实体的更正工作版本:
public class Subject
{
public int ID { get; set; }
public string Title { get; set; }
public int DepartmentID { get; set; }
public Department Department { get; set; }
}
我觉得你可能没有告诉 EF 外键是什么。告诉 EF 这个 link 的映射 class 在哪里?如果您没有这个,请在主题上的部门导航 属性 上方添加 [ForeignKey("DepartmentID")] 属性,看看是否可以解决您的问题,新部门是否。 :)