2011-04-20 68 views
1

我有一個POCO類這樣自我跟蹤POCO

public Profile 
{ 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual string Description 
    { 
     get; 
     set; 
    } 

    public virtual bool Enabled 
    { 
     get; 
     set; 
    } 
} 

當我嘗試更新這樣

var prof = new Profile(){ ID = 1, Enabled = false }; 
context.Profiles.Single (s => s.ID == 1); 
context.Profiles.ApplyCurrentValues(prof); 
context.SaveChanges(); 

的Sql說,我認爲說明不允許NULL,但我不更新「說明」列,我想只更新「啓用」字段。

怎麼了?

韓國社交協會

+0

在您的更新代碼中,第二行是否更改第三行的對象?它看起來像第二行沒有影響第三行(至少,這是我期望它的工作原理)。 – 2011-04-20 23:00:17

+0

奧斯汀,第二行是將我的分開的註冊表與持久化的註冊表聯繫起來 – Alexandre 2011-04-21 01:27:02

回答

2

試試這個:

var prof = new Profile { ID = 1, Enabled = false }; 
// Attach prof as unchanged entity 
context.Profiles.Attach(prof); 
// Get state entry for prof 
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(prof); 
// Set only Enabled property to changed 
entry.SetModifiedProperty("Enabled"); 
context.SaveChanges(); 

正如你可以看到我並不需要從數據庫中首先加載實體。我可以設置哪個屬性在分離的實體上被修改。

+0

它的工作原理,tks。我正在考慮更改t4模板以添加entry.SetModifiedProperty(「PropName」);在所有物業上,你覺得怎麼樣? – Alexandre 2011-04-25 12:08:58

+0

然後它將與將整個實體設置爲修改狀態相同=所有屬性將被更新。 – 2011-04-25 12:17:20

+0

是的,但我只會調用entry.SetModifiedProperty(「PropName」)如果屬性的值已更改 – Alexandre 2011-04-25 12:50:13

0

根據我的意見:不知道EF4,這是我希望它的工作:

var prof = context.Profiles.Single (s => s.ID == 1); 
prof.Enabled = false; 
context.Profiles.ApplyCurrentValues(prof); 
context.SaveChanges(); 

假設Single是LINQ的單,那麼它會返回一個值,你應該修改。

+0

這種方式可行,但ef仍在爲所有列生成更新 – Alexandre 2011-04-21 01:24:19

0

這不行嗎?

var prof = context.Profiles.Single(s => s.ID == 1); 
prof.Enabled = false; 
context.SaveChanges(); 

我認爲問題是,你從一個未經跟蹤的對象調用ApplyCurrentValues - 這意味着它不知道哪個屬性有和沒有改變,所以整個只是複製所有屬性,包括那些是null的 - 在你的情況下描述。

如果修改從數據上下文加載的實體的值,則不需要調用ApplyCurrentValues。

+0

它有效,但我的最終用戶無權訪問數據上下文。我的商務艙得到實體分離 – Alexandre 2011-04-24 15:22:05