2012-01-05 3 views
1

Я использую Entity Framework и .Net 4 MVC 3. В моем методе создания на моем контроллере я беру объект сотрудника, который я использую для создания записи в моей базе данных.Entity Framework - создать и использовать свойство навигации

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); 
    } 
} 

Я отправляю идентификатор менеджера с обратной стороны. Теперь, если я перенаправляюсь на страницу сведений, менеджер был создан - однако, когда я пытаюсь получить доступ к нему, как указано выше, он равен нулю. К чему я должен был прибегнуть, является:

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

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

Однако это не кажется правильным. Разумеется, EF создает для меня объект «Диспетчер», поэтому зачем мне его вручную устанавливать и устанавливать? Я делаю что-то неправильно?

ответ

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); 
} 
+0

Ok, что имеет смысл сейчас и на самом деле, кажется, правильно! Благодарю. – Terry

Смежные вопросы