Это работает для коллекций, хотя я чувствую, что должен быть лучший способ.

отаю над небольшим примером проекта с использованием 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.)

Ответы на вопрос(1)

Ваш ответ на вопрос