Я работаю над небольшим примером проекта с использованием 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 («first», «second») в базе данных, и я сохранил 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.Если я получаю новый Контекст и запрашиваю этого Person, EmployeeType остается установленным на «first», как это было до запуска этого кода.
Что мне нужно сделать, чтобы обновить свойства навигации,а не только скалярные свойства? (Это особенно озадачивает, потому что для EmployeeType единственное, что действительно нужно изменить, - это внешний ключ в таблице Person, и этот ключ является скалярным свойством.)
(Кстати, я знаю, что могу сделать это, сначала извлекая Person, затем меняя свойства по одному, но, поскольку я использую привязку модели в ASP.NET MVC, кажется, что этот способ будет проще, потому чтоУ меня будет обновленный объект person уже в моем методе POST.)