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