添加对象后,实体框架不会加载导航属性

use*_*622 3 c# entity-framework entity-framework-6

我有MVC项目和EF6模型.

在此输入图像描述

LazyLoading已启用.在控制器中我有以下动作

    public ActionResult AddStage(int projectId, int employeeId)
    {
        using(var context = new TestProjectEntities())
        {
            var project = context.Projects.Find(projectId);
            if (project != null)
            {
                var stage = new Stage() {EmployeeID = employeeId, StageType = 1};
                project.Stages.Add(stage);
                context.Stages.Add(stage);
                context.SaveChanges();
            }

            ListEmployees(project);
        }

        return Redirect("Index");
    }

    private void ListEmployees(Project project)
    {
        var names = new List<string>();
        foreach(var stage in project.Stages)
        {
            if (stage.Employee != null)
            {
                names.Add(stage.Employee.Name);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是在foree语句中的ListEmployees方法stage.Employee == null中.为什么?

如果我第二次调用AddStage,那么ListEmployee中的stage.Employee!= null

hai*_*770 9

那是因为你只需设置外键属性(Stage.EmployeeID)而不设置navigation-property(Stage.Employee).

通常,在调用之后SaveChanges(),EF也会更新导航属性.但是,由于Stage对象是由您手动创建的,因此不会对其进行跟踪(使用DynamicProxy),您必须明确修复关系:

context.Entry(stage).Reference(c => c.Employee).Load();
Run Code Online (Sandbox Code Playgroud)

另一种方法是获取Employee并使用它而不是设置外键属性:

var employee = context.Employees.Find(employeeId);
var stage = new Stage() { Employee = employee, StageType = 1};
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN