Linq2SQL使用Update StoredProcedure

时间:2010-03-01 16:57:02

标签: linq-to-sql stored-procedures

我们使用Linq生成的查询进行数据检索,但对于INSERT和UPDATE,我们不允许生成SQL,但限制使用存储过程。

我将DBML中的Update和Insert行为连接到存储过程。 调用这些过程,插入/更新数据=如果正常则为全部,除了乐观并发

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

当Linq自己生成Update语句时,它会按预期抛出 ChangeConflictException ,但是使用存储过程不会抛出异常

非常感谢您对此有任何帮助!

2 个答案:

答案 0 :(得分:3)

在配置UPDATE行为以使用更新存储过程时,Linq2SQL会生成不抛出并发异常的方法。 处理乐观并发I found a proposed solution in the MSDN forums

您可以在patial DataContext类中自己实现Update方法并抛出 ChangeConflictException

要实现这一目标,您必须:

  • 编写一个更新存储过程,它将当前值和原始值作为参数
    • 仅在值未更改的情况下使用WHERE columnA = OriginalValueA ...进行更新
    • 存储过程的最后一行是RETURN @@ROWCOUNT
    • 行计数可让您查看行是否已更新
  • DBML中的
  • 将Update行为设置为“use runtime”
  • partial class xxxDataContext实现一个这样的Update方法:
    • 代码取自Linq2SQL生成的内容,只是添加抛出异常的最后一行
partial void UpdateYourEntityClass(YourEntityClass obj)
        {
            EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj)));
            int result = this.YourEntityClassUpdate((...));
            if (result == 0) throw new ChangeConflictException();
        }

工作,但不是直截了当。 还有其他选择吗?

答案 1 :(得分:0)

这并不让我感到惊讶。在调用存储过程进行更新和删除时,您将不得不进行自己的并发检查。 L2S将无法执行此操作,因为您通过使用存储过程基本上将L2S切断了循环。

这是我们在执行插入/更新/删除时不使用任何没有L2S后端的存储过程的原因之一。使用存储过程的另一个缺点是您在插入/更新/删除语句中丢失了强类型检查。