Я работаю над небольшим образцовым проектом, используя 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, у которого есть первый тип. Теперь я хочу изменить Личность. Я знаю, что могу сделать это, загрузив 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, и этот ключ является скалярным свойством.)
(Кстати, я знаю, что могу сделать это, сначала извлекая Person, а затем меняя свойства один за другим, но поскольку я использую привязку к модели в ASP.NET MVC, похоже, этот способ был бы проще, потому что у меня будет обновленный объект человека уже в методе POST.)