我们使用Linq生成的查询进行数据检索,但对于INSERT和UPDATE,我们不允许生成SQL,但限制使用存储过程。
我将DBML中的Update和Insert行为连接到存储过程。 调用这些过程,插入/更新数据=如果正常则为全部,除了乐观并发。
如果在检索和更新之间更改了记录,则更新应该失败。
当Linq自己生成Update语句时,它会按预期抛出 ChangeConflictException ,但是使用存储过程不会抛出异常。
非常感谢您对此有任何帮助!
答案 0 :(得分:3)
在配置UPDATE行为以使用更新存储过程时,Linq2SQL会生成不抛出并发异常的方法。 处理乐观并发I found a proposed solution in the MSDN forums
您可以在patial 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(); }
工作,但不是直截了当。 还有其他选择吗?
答案 1 :(得分:0)
这并不让我感到惊讶。在调用存储过程进行更新和删除时,您将不得不进行自己的并发检查。 L2S将无法执行此操作,因为您通过使用存储过程基本上将L2S切断了循环。
这是我们在执行插入/更新/删除时不使用任何没有L2S后端的存储过程的原因之一。使用存储过程的另一个缺点是您在插入/更新/删除语句中丢失了强类型检查。