我要瘋了,應該是一個非常簡單的情況。在ASP.NET MVC 2應用程序中(並非我認爲這很重要),我有一個編輯操作,它需要一個非常小的實體並進行一些更改。 (外面的錯誤處理/安全性)的關鍵部分是這樣的:在什麼情況下,LINQ-to-SQL實體會「丟失」更改的字段?
Todo t = Repository.GetTodoByID(todoID);
UpdateModel(t);
Repository.Save();
Todo
是很簡單的,小的實體具有以下字段:ID
(主鍵),FolderID
(外鍵),PercentComplete
,TodoText
,IsDeleted
和SaleEffortID
(外鍵)。這些中的每一個顯然對應於數據庫中的字段。
當調用UpdateModel(t)
時,t
確實會針對所有已更改的字段進行正確更新。
當調用Repository.Save()
時,在寫出SQL時,FolderID
恢復爲其原始值。完整的代碼Repository.Save()
:
public void Save()
{
myDataContext.SubmitChanges();
}
myDataContext
是由LINQ到SQL設計器創建的DataContext類的一個實例。除了向一些實體添加一些通用接口之外,沒有爲此做任何定製。
我已經驗證了FolderID是獲得呼叫之前通過註銷生成的SQL輸給Repository.Save()
:
UPDATE [Todo].[TD_TODO]
SET
[TD_PercentComplete] = @p4,
[TD_TodoText] = @p5,
[TD_IsDeleted] = @p6
WHERE
([TD_ID] = @p0) AND
([TD_TDF_ID] = @p1) AND /* Folder ID */
([TD_PercentComplete] = @p2) AND
([TD_TodoText] = @p3) AND
(NOT ([TD_IsDeleted] = 1)) AND
([TD_SE_ID] IS NULL) /* SaleEffort ID */
-- @p0: Input BigInt (Size = -1; Prec = 0; Scale = 0) [5]
-- @p1: Input BigInt (Size = -1; Prec = 0; Scale = 0) [1] /* this SHOULD be 4 and in the update list */
-- @p2: Input TinyInt (Size = -1; Prec = 0; Scale = 0) [90]
-- @p3: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [changing text]
-- @p4: Input TinyInt (Size = -1; Prec = 0; Scale = 0) [0]
-- @p5: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [changing text foo]
-- @p6: Input Bit (Size = -1; Prec = 0; Scale = 0) [True]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1
UpdateModel(t)
之間某處所以(在那裏我在FolderID更新調試驗證過)和這個SQL的輸出,FolderID恢復。 其他字段全部保存。 (嗯,好吧,我沒有驗證SaleEffortID,但因爲該子系統是不是真的準備好了,但一切的撲救。)
我已經用盡了我自己的研究方法對這樣的:沒有人知道的情況這會導致部分實體重置(EG,與long
外鍵有關?),和/或如何解決此問題?
我認爲你有一些東西;我*沒有在調試器中檢查的一件事是實際的'TodoFolder'屬性 - 是的,我在實體指向加載後改變了FK。我會與之合作,看看它給我帶來多大的幫助。 – 2010-05-03 14:26:39
你已經贏得了賞金。就是這樣;謝謝! (這也是*殺死了我!)(不幸的是,SO不會讓我給你賞金,22小時。) – 2010-05-03 14:29:25
太棒了!我很高興我可以幫助你:-) – AHM 2010-05-03 14:58:34