导航属性未加载 - 急切加载

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,而只是 DepartmentDepartmentID 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")] 属性,看看是否可以解决您的问题,新部门是否。 :)