我正在使用实体框架和.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对象,为什么我需要手动获取和设置它?我做错了吗?
答案 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);
}