我先使用代碼,並且可以添加記錄而沒有問題。該數據庫已正確創建,播種沒有任何問題。但是在我的Edit動作中調用SaveChanges()只會更新實體,而不是任何導航或引用屬性。EF 4.1 SaveChanges不更新導航或引用屬性
的簡化版本我的模型:
public class Contact : IMyBaseObject
{
public Contact()
{
this.Delete = false;
this.ContactTypes = new HashSet<ContactType>();
}
public int Id {get; set;}
public string Name {get;set;}
public bool Delete {get;set;}
public virtual ICollection<ContactType> ContactTypes { get; set; }
public virtual USState USState { get; set; }
}
public class ContactType : MyBaseObject
{
public ContactType()
{
}
public int Id {get; set;}
public string Name {get;set;}
public virtual ICollection<Contact> Contacts {get;set;}
}
public abstract class Territory : MyBaseObject
{
public int Id {get; set;}
public string Name {get;set;}
public string Code {get;set;}
}
public class USState : Territory
{
public USState()
{
}
// Navigation properties
public virtual ICollection<Contact> Contacts { get; set; }
}
我將不包括代碼,但我有一些自定義的模型綁定怎麼回事。我的編輯操作(使用MVC 3)未使用ContactType或USState屬性填充。該綁定正確地返回具有來自表單的正確值的完全填充的Contact對象。
如果我沒有理解EF 4.1正常,我應該只救了我的聯繫對象時做到以下幾點堅持對數據庫的修改:
if(ModelState.IsValid)
{
context.Entry(contact).State = EntryState.Modified;
context.SaveChanges();
}
然而,當我這樣做,只有基本屬性正在更新。在上面的例子中,我忽略了一些東西:我正在使用事務,try catch塊,並檢查它是否是新記錄。
我已經使用SQL事件探查器,並且可以確認ContactType和Territory表的更新查詢是發送到數據庫服務器的而不是。
的我的導航和參考性的國家屬性被修改,但我自己也嘗試手動設置是:
context.Entry(contact).Collections("ContactTypes").EntityEntry.State = EntityState.Modified;
context.Entry(contact).Reference("USState").EntityEntry.State = EntityState.Modified;
我可能是錯誤的,但我敢肯定,我的代碼是CTP5下工作。
任何想法?在這一點上,我不知道我應該如何處理這個問題。
謝謝你,史蒂夫
這個問題在過去21小時內第三次被問到。這裏是以前:http://stackoverflow.com/questions/5506116/entity-framework-code-first-why-cant-i-update-complex-properties-this-way和http://stackoverflow.com/questions/ 5507596/entity-framework-4-1-rc-code-first-entity-not-updating-over-association – 2011-04-01 18:20:55
有趣的。我應用了您在其他問題中描述的解決方案,但這不適合我。沒有錯誤,但沒有更新查詢被髮送到數據庫。我想我會嘗試刪除導航/引用屬性,並嘗試將它們添加回來。 – 2011-04-01 19:55:28
Steve,什麼是MyBaseObject,我在您的文章中沒有看到該類的代碼。我假設它是一個類,因爲它不遵循作爲接口的約定。其次,你可能想爲DbContext實現一個非常基本的存儲庫模式,因爲這將有助於保持你的代碼更有組織性,並給你一個抽象層次。 – 2011-04-16 00:26:09