2010-04-30 90 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

相关问题