2012-09-19 94 views
2

這個主題的許多問題都不符合我的情況。我有一個大數據模型。在某些情況下,只需要在UI上顯示一些字段,因此對於那些我將LINQ to Entity查詢替換爲使用Entity SQL查詢抽取所有內容的查詢,僅使用Type構造函數檢索所需的列,以便獲得一個實體返回,而不是一個DbDataRecord,像這樣:實體框架5 SaveChanges不工作,沒有錯誤

SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ... 

這可以工作並顯示UI中的字段。如果我做了更改,當我從UI元素中取出標籤時,更改會將其返回到實體模型。但是當我執行SaveChanges時,更改不會持久保存到數據庫。 Log中沒有顯示錯誤。現在,如果我非常仔細地與實體SQL查詢檢索整個實體,像這樣替換上面的查詢:

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident... 

變化做在數據庫中得到堅持!因此,作爲測試,我創建了另一個查詢,如第一個爲實體中的每個列命名的查詢,這應該與第二個實體SQL查詢完全相同。但它並沒有對數據庫做出任何改變。

我試圖返回的結果設置MergeOption到PreserveChanges,開始跟蹤,像這樣:

incidents.MergeOption = MergeOption.PreserveChanges; 

但是這並沒有影響。但是,實際上,如果使用Entity Sql檢索整個實體仍然存在更改,那麼在檢索字段的子集時,行爲會有什麼邏輯目的?我想知道這是否是一個錯誤?

+0

我_think_這是相同的區別只是作爲一個newing'Incident'代碼或獲取它上下文中的集合。第一個實例沒有被跟蹤,因爲上下文不知道它。 –

+0

不確定它是否相關,但我忘記顯示返回的值ObjectQuery 傳入CollectionViewSource對象。這就是數據填充字段的原因,更改被推回到實體字段。 – whandley

+0

謝謝。但是,如果是這樣,我如何才能讓情境知道?我認爲MergeOption.PreserveChanges會確保這一點,但它不起作用。 – whandley

回答

0

Gert是正確的,問題是該實體沒有連接。 Dank U wel,Gert! Ik是ervan verbluft! 我只是想添加一些細節來顯示完整的解決方案。基本上,ObjectContext有一個Attach方法,所以你會認爲這是它。但是,如果您的實體SQL選擇語句名稱列,並且您使用Type創建對象,則不會創建EntityKey,並且ObjectContext.Attach會失敗。在嘗試並未能插入我自己創建的EntityKey之後,我偶然發現了ObjectSet.Attach,並添加到實體框架4中。而不是失敗,它會創建EntityKey(如果缺失)。很好的接觸。

的代碼是(這或許可以以更少的步驟做,但我知道這工作):

var QueryString = "SELECT VALUE RunTimeUIDesigner.INCIDENT (incident.INCIDENT_NBR,incident.LOCATION,etc" 
ObjectQuery<INCIDENT> incidents = orbcadDB.CreateQuery<INCIDENT>(QueryString); 
incidents.MergeOption = MergeOption.PreserveChanges; 
List<INCIDENT> retrievedIncidents = incidents.ToList<INCIDENT>(); 
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]); 
iNCIDENTsViewSource.Source = retrievedIncidents; 
相關問題