2010-09-16 62 views
1

我需要從數據庫中加載一個對象,修改它的一些字段和關係,然後我想只爲一個字段存儲一個新值,而不修改其餘字段。如何使用實體框架從實體更新單個字段?

這將是這個樣子:

var thing = db.Things.First(); 

thing.Field1 = "asdas"; 
thing.Field2 = 23; 
thing.OtherThings.Add(new OtherThing()); 
thing.FieldToUpdate = doSomething(thing); 

db.SaveChanges(); 

但是,這將保存所有的變化,我要的是僅保存FieldToUpdate ...

我環顧四周,所有我我發現是使用存儲過程,這似乎太多東西看起來如此簡單,除了我將不得不做一個不同的存儲過程,每次我需要做這樣的事情...

我目前的解決方案是打開另一個上下文,加載這個東西ain,更新FieldToUpdate和SaveChanges,但這既低效又醜陋。

回答

0

實體框架非常聰明,能夠找出什麼發生了變化,什麼沒有發生變化,並且相應地優化了SQL語句。如果您只更改FieldToUpdate,那麼SQL語句只會是單個字段的更新,而不是所有內容。

但是,如果您確實從原來的Field1和Field2中更改了Field1和Field2,它們也將被保留,但只有在它們更改時纔會保留。否則,不需要告訴數據庫將其更改爲已有的數據。

實體框架這樣做,因爲這正是開發人員想要的99.9%的時間。如果你打算使用一個實體對象作爲你想要移動和操作的對象,而不是將它當作數據庫的模型來處理(比如它應該是這樣),那麼你可能需要考慮創建另一個新的包裝類這可以讓你處理所有你想要的數據字段(以及其他不在其中的數據字段),然後讓它的保存方法做適當的實體框架持久性,以保持事物的獨立性和乾淨性。

2

如果你想用附加的實體做這件事,你必須更新FieldToUpdate FIRST並調用SaveChanges。如果需要,您可以更新其他字段並再次調用SaveChanges。沒有其他方式與附屬實體。

你可以嘗試的其他方式是分離實體,修改你想要的(它不會跟蹤更改)。然後將實體附加到上下文並調用:

// I suppose that db is ObjectContext or inherited type 
db.ObjectStateManager.GetObjectStateEntry(thing).SetModifiedProperty("FieldToUpdate"); 

現在只有FieldToUpdate被跟蹤爲已更改。