我正在使用實體框架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();
奇怪的是,這改變了名字和姓氏,但不能EmployeeType。如果我得到一個新的上下文並請求這個Person,那麼EmployeeType仍然被設置爲「first」,就像這個代碼運行之前一樣。
我需要做什麼才能讓導航屬性更新,而不僅僅是標量屬性?(這是特別令人費解的,因爲對於EmployeeType,唯一需要改變的是Person表中的外鍵,並且該鍵是標量屬性。)
(順便說一句,我知道我可以做通過先檢索Person,然後逐個更改屬性,但是因爲我在ASP.NET MVC中使用了模型綁定,所以似乎這種方式會更容易,因爲我將更新的人員對象已經存在於我的POST方法)
呃,這真的可以嗎?我寧願將EmployeeType標記爲Modified以及Person。雖然當我嘗試時,它也沒有工作。 – 2011-03-31 21:08:45
由於獨立聯繫而無法工作 - 正如我所說它是單獨的對象。可能還有其他方法。我會修改我的答案。 – 2011-03-31 21:10:54
我試過它的「其他方式」:「DbUpdateException:保存不爲其關係提供外鍵屬性的實體時發生錯誤。EntityEntries屬性將返回null,因爲單個實體不能被識別爲異常的來源。通過在您的實體類型中公開外鍵屬性,可以更輕鬆地處理保存的異常。有關詳細信息,請參閱InnerException。 – 2011-03-31 21:20:48