实体框架 - 创建和使用导航属性

时间:2012-01-05 20:01:56

标签: .net entity-framework

我正在使用实体框架和.Net 4 MVC 3.在我的控制器上的创建方法中,我接受了一个雇员对象,我用它在我的数据库中创建条目。

public class Employee 
{
    public int Id { get; set; }
    public int ManagerId { get; set; }
    public virtual Employee Manager { get; set; }
}

public ActionResult Create(Employee model)
{
    if (ModelState.IsValid)
    {
        db.Employees.Add(model);
        db.SaveChanges();

        // Now I want to use the navigation properties
        Notification(model.Manager.Name);
    }
}

我从视图中发布了经理ID。现在,如果我重定向回到详细信息页面,那么管理器已经创建了 - 但是当我尝试像上面那样访问它时它是null。我不得不求助于:

if (ModelState.IsValid)
{
    model.Manager = _employeeRepository.Get(model.ManagerId);
    db.Employees.Add(model);
    db.SaveChanges();

    // Now this works
    Notification(model.Manager.Name);
}

然而这似乎不对。当然EF为我创建了Manager对象,为什么我需要手动获取和设置它?我做错了吗?

1 个答案:

答案 0 :(得分:2)

虽然看似错误,但这是预期的功能,您的解决方案大致正确。 EF DbContext无法自动获取Manager属性,因为这样做可能会带来成本高昂的代价。如果它自动完成并且不想要那样,你就会对EF感到生气。答案(以及您的原始解决方案)是在后续调用中明确获取数据。

我建议稍微不同的实现:

if (ModelState.IsValid)
{
    db.Employees.Add(model);
    db.SaveChanges();

    // Get the manager name only after the SaveChanges is successful
    // Will fail if the manager ID is not valid
    var managerName = db.Managers.Where(mgr => mgr.ManagerId == model.ManagerId).Select(mgr => mgr.Name).Single();
    Notification(managerName);
}