2010-03-01 69 views
4

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

我将DBML中的更新和插入行为连接到存储过程。 程序被调用,数据被插入/更新=全部如果罚款,,除了乐观并发

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

当LINQ的生成更新语句本身,它抛出一个ChangeConflictException如预期,但使用存储过程也不例外抛出。

非常感谢您的帮助!

回答

3

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

可以实现在(ε2)DataContext类Update方法自己,并抛出一个ChangeConflictException

要做到这一点,你必须:

  • 写的更新存储过程与使用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(); 
     } 

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

0

这并不让我感到意外。当调用存储过程来执行更新和删除时,您将不得不做自己的并发检查。 L2S将无法做到这一点,因为您已经基本上使用存储的特效将L2S从循环中删除。

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

+0

谢谢! DBML设计器允许将INSERT,UPDATE和DELETE行为映射到存储过程。它还允许将原始值映射到更新存储过程的参数。唯一缺少的部分是检查rowcount并抛出ChangeConflictException。除了Designer.cs中生成的代码之外,其中的所有内容都不会抛出异常。 – PeterFromCologne 2010-03-02 13:55:38