2010-04-30 32 views
1

我要瘋了,應該是一個非常簡單的情況。在ASP.NET MVC 2應用程序中(並非我認爲這很重要),我有一個編輯操作,它需要一個非常小的實體並進行一些更改。 (外面的錯誤處理/安全性)的關鍵部分是這樣的:在什麼情況下,LINQ-to-SQL實體會「丟失」更改的字段?

Todo t = Repository.GetTodoByID(todoID); 

UpdateModel(t); 
Repository.Save(); 

Todo是很簡單的,小的實體具有以下字段:ID(主鍵),FolderID(外鍵),PercentCompleteTodoTextIsDeletedSaleEffortID(外鍵)。這些中的每一個顯然對應於數據庫中的字段。

當調用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外鍵有關?),和/或如何解決此問題?

回答

1

我能想到的唯一的事情是,如果在調用UpdateModel之前,某些東西強制datacontext加載相關實體(在這種情況下,它應該是Folder)。

如果您在裝入Folder實體後嘗試更改FolderID,它將以靜默方式失敗並保留其舊值。這可能很煩人。我不知道這裏是否屬於這種情況,但是您看起來肯定值是由UpdateModel調用更新的。

通常情況下,如果在datacontext嘗試加載相關實體之前更改了外鍵,那麼會加載正確的實體(帶有新鍵的那個實體),但不知何故,可能會觸發一個神祕行爲這種情況 - 我知道繼續下去並不多,但我肯定希望這與延遲加載相關實體有關。

+0

我認爲你有一些東西;我*沒有在調試器中檢查的一件事是實際的'TodoFolder'屬性 - 是的,我在實體指向加載後改變了FK。我會與之合作,看看它給我帶來多大的幫助。 – 2010-05-03 14:26:39

+0

你已經贏得了賞金。就是這樣;謝謝! (這也是*殺死了我!)(不幸的是,SO不會讓我給你賞金,22小時。) – 2010-05-03 14:29:25

+0

太棒了!我很高興我可以幫助你:-) – AHM 2010-05-03 14:58:34

相關問題