我们使用由Linq生成的查询进行数据检索,但对于INSERT和UPDATE,我们不允许生成SQL,但仅限于使用存储过程。使用更新存储过程的Linq2SQL
我将DBML中的更新和插入行为连接到存储过程。 程序被调用,数据被插入/更新=全部如果罚款,,除了乐观并发。
如果在检索和更新之间更改记录,则更新应该失败。
当LINQ的生成更新语句本身,它抛出一个ChangeConflictException如预期,但使用存储过程也不例外抛出。
非常感谢您的帮助!
我们使用由Linq生成的查询进行数据检索,但对于INSERT和UPDATE,我们不允许生成SQL,但仅限于使用存储过程。使用更新存储过程的Linq2SQL
我将DBML中的更新和插入行为连接到存储过程。 程序被调用,数据被插入/更新=全部如果罚款,,除了乐观并发。
如果在检索和更新之间更改记录,则更新应该失败。
当LINQ的生成更新语句本身,它抛出一个ChangeConflictException如预期,但使用存储过程也不例外抛出。
非常感谢您的帮助!
当配置UPDATE行为以使用更新存储过程时,Linq2SQL会生成一个方法,即不会引发并发异常。 为了处理乐观并发I found a proposed solution in the MSDN forums
可以实现在(ε2)DataContext类Update方法自己,并抛出一个ChangeConflictException。
要做到这一点,你必须:
WHERE columnA = OriginalValueA ...
仅更新如果值没有改变参数
RETURN @@ROWCOUNT
partial void UpdateYourEntityClass(YourEntityClass obj) { EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj))); int result = this.YourEntityClassUpdate((...)); if (result == 0) throw new ChangeConflictException(); }
工作,但不是直截了当。 有没有其他的选择?
这并不让我感到意外。当调用存储过程来执行更新和删除时,您将不得不做自己的并发检查。 L2S将无法做到这一点,因为您已经基本上使用存储的特效将L2S从循环中删除。
这是我们在做插入/更新/删除操作时不使用任何存储过程而没有L2S后端的原因之一。使用存储过程的另一个缺点是对插入/更新/删除语句失去了强类型检查。
谢谢! DBML设计器允许将INSERT,UPDATE和DELETE行为映射到存储过程。它还允许将原始值映射到更新存储过程的参数。唯一缺少的部分是检查rowcount并抛出ChangeConflictException。除了Designer.cs中生成的代码之外,其中的所有内容都不会抛出异常。 – PeterFromCologne 2010-03-02 13:55:38