Entity Framework Code First - Почему я не могу обновить сложные свойства таким образом?

Я работаю над небольшим примером проекта с использованием Entity Framework 4.1 (сначала код). Мои классы выглядят следующим образом:

public class Context : DbContext
{
    public IDbSet<Person> People { get; set; }
    public IDbSet<EmployeeType> EmployeeTypes { get; set; }
}

public class Person
{
    [Key]
    public int Key { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    virtual public EmployeeType EmployeeType { get; set; }
}

public class EmployeeType
{
    [Key]
    public int Key { get; set; }
    public string Text { get; set; }

    virtual public ICollection<Person> People { get; set; }
}

Я сохранил пару типов EmployeeTypes («первый», «второй») в базе данных и сохранил человека с первым типом. Теперь я хочу изменить человека. Я знаю, что могу сделать это, загрузив Person, изменив свойства, а затем сохранив. Но вместо этого я хочу сделать следующее, что, как мне кажется, должно работать:

var c = new Context();
var e = c.EmployeeTypes.Single(x => x.Text.Equals("second"));
var p = new Person { 
            Key = originalKey,       // same key
            FirstName = "NewFirst",  // new first name
            LastName = "NewLast",    // new last name
            EmployeeType = e };      // new employee type
c.Entry(p).State = EntityState.Modified;
c.SaveChanges();

Как ни странно, это изменяет FirstName и LastName, но не EmployeeType. Если я получаю новый контекст и запрашиваю этого человека, EmployeeType остается установленным на «первый», как это было до запуска этого кода.

Что мне нужно сделать, чтобы обновить свойства навигации, а не только скалярные свойства? (Это особенно озадачивает, потому что для EmployeeType единственное, что действительно нужно изменить, - это внешний ключ в таблице Person, а этот ключ является скалярным свойством.)

(By Кстати, я знаю, что могу сделать это, сначала получив Person, а затем изменяя свойства одно за другим, но поскольку я использую привязку модели в ASP.NET MVC, похоже, что этот способ будет проще, потому что я обновленный объект человека уже есть в моем методе POST.)

28
задан Ladislav Mrnka 31 March 2011 в 20:51
поделиться