代码之家  ›  专栏  ›  技术社区  ›  PeterFromCologne

使用update storedprocedure的linq2sql

  •  4
  • PeterFromCologne  · 技术社区  · 16 年前

    我们使用linq生成的查询进行数据检索,但是对于insert和update,我们不允许生成sql,而是限制使用存储过程。

    我将dbml中的更新和插入行为连接到存储过程。 过程被调用,数据被插入/更新=如果可以的话, 除非在乐观并发的情况下 .

    如果在检索和更新之间更改了记录,则更新应失败。

    当linq生成update语句时,它抛出一个 变更冲突异常 如预期,但使用 存储过程无异常 被扔掉。

    非常感谢你的帮助!

    2 回复  |  直到 16 年前
        1
  •  3
  •   PeterFromCologne    16 年前

    当配置更新行为以使用更新存储过程时,linq2sql生成一个方法 不引发并发 例外情况。 处理乐观并发 I found a proposed solution in the MSDN forums

    你可以 实现更新方法 在patial datacontext类中抛出 变更冲突异常 。

    要做到这一点,你必须:

    • 编写一个以当前值和原始值为参数的更新存储过程
      • 使用 WHERE columnA = OriginalValueA ... 仅在值未更改时更新
      • 存储过程中的最后一行是 RETURN @@ROWCOUNT
      • rowcount允许您查看行是否已更新
    • 在dbml中,将更新行为设置为“使用运行时”
    • 部分类xxxDataContext实现了如下更新方法:
      • 代码取自linq2sql生成的代码,只添加了抛出异常的最后一行
    partial void UpdateYourEntityClass(YourEntityClass obj)
            {
                EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj)));
                int result = this.YourEntityClassUpdate((...));
                if (result == 0) throw new ChangeConflictException();
            }
    

    工作,但不是直接的。 还有其他选择吗?

        2
  •  0
  •   Randy Minder    16 年前

    这并不奇怪。当调用存储过程来执行更新和删除时,必须自己执行并发检查。L2不能做到这一点,因为您基本上已经通过使用存储过程将L2从循环中切掉了。

    这就是为什么我们在执行插入/更新/删除操作时不使用任何不带l2s后端的存储过程的原因之一。使用存储过程的另一个缺点是无法对insert/update/delete语句进行强类型检查。

    推荐文章