Linq to sql 在什么情况下,LINQ to SQL实体;“失去”;改变了的领域?

Linq to sql 在什么情况下,LINQ to SQL实体;“失去”;改变了的领域?,linq-to-sql,asp.net-mvc-2,.net-4.0,data-access-layer,Linq To Sql,Asp.net Mvc 2,.net 4.0,Data Access Layer,我为一个非常简单的情况而发疯。在ASP.NET MVC 2应用程序中(我认为这并不重要),我有一个编辑操作,它使用一个非常小的实体并进行一些更改。关键部分(错误处理/安全性之外)如下所示: Todo t = Repository.GetTodoByID(todoID); UpdateModel(t); Repository.Save(); Todo是一个非常简单的小实体,具有以下字段:ID(主键)、FolderID(外键)、PercentComplete、TodoText、删除和salefo

我为一个非常简单的情况而发疯。在ASP.NET MVC 2应用程序中(我认为这并不重要),我有一个编辑操作,它使用一个非常小的实体并进行一些更改。关键部分(错误处理/安全性之外)如下所示:

Todo t = Repository.GetTodoByID(todoID);

UpdateModel(t);
Repository.Save();
Todo
是一个非常简单的小实体,具有以下字段:
ID
(主键)、
FolderID
(外键)、
PercentComplete
TodoText
删除
salefortid
(外键)。显然,每个字段都对应于数据库中的一个字段

调用
UpdateModel(t)
时,
t
会正确更新所有已更改的字段

调用
Repository.Save()
时,当SQL被写出时,
FolderID
将恢复为其原始值。将完整的代码保存到
存储库.Save()

myDataContext
是由LINQ to SQL设计器创建的DataContext类的实例。除了向某些实体添加一些公共接口之外,没有对其进行任何自定义

在调用
Repository.Save()
之前,我通过注销生成的SQL验证了FolderID是否丢失:

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会恢复。其他字段全部保存。(好吧,好吧,我还没有验证Saleefortid,因为该子系统还没有真正准备好,但其他一切都可以保存。)


我已经用尽了我自己的研究方法:有人知道会导致部分实体重置的条件吗(例如,与
long
外键有关吗?)和/或如何解决这个问题吗?

我唯一能想到的是,如果有什么事情迫使datacontext加载相关实体(我想在本例中是文件夹)在调用UpdateModel之前

如果在加载文件夹实体后尝试更改FolderID,它将自动失败并保留其旧值。这可能有点烦人。我不知道这里是否存在这种情况,但是,因为您似乎肯定值是通过UpdateModel调用更新的


通常,如果在datacontext尝试加载相关实体之前更改了外键,则将加载正确的实体(具有新键的实体),但不知何故,在这种情况下,可能发生了一些事情,触发了一种神秘的行为——我知道这不太可能发生,但我肯定会认为这与延迟加载相关实体有关。

我唯一能想到的是,如果有什么事情迫使datacontext加载相关实体(我想在本例中是文件夹)在调用UpdateModel之前

如果在加载文件夹实体后尝试更改FolderID,它将自动失败并保留其旧值。这可能有点烦人。我不知道这里是否存在这种情况,但是,因为您似乎肯定值是通过UpdateModel调用更新的


通常,如果在datacontext尝试加载相关实体之前更改了外键,则将加载正确的实体(具有新键的实体),但不知何故,在这种情况下,可能会发生一些触发神秘行为的事情-我知道这不太可能发生,但我肯定会认为这与延迟加载相关实体有关。

我想你有什么问题;我没有在调试器中检查的一件事是实际的
TodoFolder
pr不动产——是的,在实体指向负载后,我正在更改FK。我将使用它,看看它能让我走多远。你赢得了赏金。就是这样;谢谢你!(这也让我很难受!)(不幸的是,我还不让我给你赏金。22小时。)太好了!我很高兴能帮助你:-)我想你找到了一些东西;我没有在调试器中检查的一件事是实际的
TodoFolder
属性——是的,我在实体指向loads后更改FK。我将使用它,看看它能让我走多远。你赢得了赏金。就是这样;谢谢你!(这也让我很难受!)(不幸的是,我还不想给你赏金。22小时。)太好了!我很高兴能帮助你:-)
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