2011-04-01 115 views
16

我先使用代碼,並且可以添加記錄而沒有問題。該數據庫已正確創建,播種沒有任何問題。但是在我的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下工作。

任何想法?在這一點上,我不知道我應該如何處理這個問題。

謝謝你,史蒂夫

+2

這個問題在過去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

+0

有趣的。我應用了您在其他問題中描述的解決方案,但這不適合我。沒有錯誤,但沒有更新查詢被髮送到數據庫。我想我會嘗試刪除導航/引用屬性,並嘗試將它們添加回來。 – 2011-04-01 19:55:28

+0

Steve,什麼是MyBaseObject,我在您的文章中沒有看到該類的代碼。我假設它是一個類,因爲它不遵循作爲接口的約定。其次,你可能想爲DbContext實現一個非常基本的存儲庫模式,因爲這將有助於保持你的代碼更有組織性,並給你一個抽象層次。 – 2011-04-16 00:26:09

回答

0

假設你的DAL對象/集是從實體框架,做到這一點;

Contact.ContactTypes.Load();

這將刷新從底層源相關coltactTypes列表。

希望這會有所幫助。

1

試試這個:

context.Entry(contact.USState).State = EntityState.Modified; ////// 
0

提供的代碼可能是不夠的。最好查看代碼中導航屬性的添加方式。 因爲即使父類被標記爲已修改,但並不意味着相關的導航屬性也會標記爲已添加或已修改。 最快的方法是打開調試器,在其中調用.SaveChanges,然後查看上下文變量,查看「Local」屬性,然後查看導航屬性是否存在,以及是否添加或修改了它們的模態,那麼告訴需要做什麼會容易得多。

0

當然,更多的代碼將有助於更好地解決問題,尤其是模型綁定的代碼正在進行。但我認爲你已經熟悉的一件事是你需要訪問這些導航屬性(不知何故),因此EF將能夠自動加載它們。因爲您將nav-properties標記爲虛擬,因此您允許EF創建代理並覆蓋您的nav-properties以允許延遲加載。