我要疯了,应该是一个非常简单的情况。在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