代码之家  ›  专栏  ›  技术社区  ›  John Rudy

在什么情况下,linq-to-sql实体会“丢失”已更改的字段?

  •  1
  • John Rudy  · 技术社区  · 14 年前

    我要为一个很简单的情况发疯了。在一个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 外键?),和/或如何解决此问题?

    1 回复  |  直到 14 年前
        1
  •  1
  •   AHM    14 年前

    我唯一能想到的是,在调用updatemodel之前,如果有什么东西强迫datacontext加载相关实体(在本例中是folder)。

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

    通常,如果在datacontext尝试加载相关实体之前更改了外键,那么将加载正确的实体(使用新键的实体),但不知何故,在这种情况下,可能会发生触发神秘行为的事情-我知道这不太可能继续,但我将定义最初希望这与相关实体的延迟加载有关。