我要为一个很简单的情况发疯了。在一个asp.net mvc 2应用程序中(我认为这并不重要),我有一个编辑操作,它需要一个非常小的实体并进行一些更改。密钥部分(在错误处理/安全性之外)如下所示:
Todo t = Repository.GetTodoByID(todoID);
UpdateModel(t);
Repository.Save();
Todo
是具有以下字段的非常简单的小实体:
ID
(主键),
FolderID
(外键),
PercentComplete
,
TodoText
,
IsDeleted
和
SaleEffortID
(外键)。其中的每一个显然都对应于数据库中的一个字段。
什么时候?
UpdateModel(t)
被称为,
t
对所有已更改的字段都正确更新。
什么时候?
Repository.Save()
当sql被写出来时,
折叠式
还原为其原始值。完整的代码
存储库。保存()
:
public void Save()
{
myDataContext.SubmitChanges();
}
myDataContext
是由linq to sql设计器创建的datacontext类的实例。除了向某些实体添加一些公共接口之外,没有对其进行任何自定义。
我已经确认在打电话给
存储库。保存()
通过注销生成的SQL:
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
所以介于
更新模型(T)
(在我已经在folderid更新的调试器中进行了验证)和这个sql的输出,folderid将恢复。这个
其他
字段全部保存。(好吧,好吧,我还没有验证saleefortid,因为那个子系统还没有真正准备好,但是其他的都保存了。)
我已经用尽了自己的研究方法:是否有人知道会导致部分实体重置的条件(例如,与
long
外键?),和/或如何解决此问题?