实体框架中使用存储过程的乐观并发

act*_*ctf 5 c# entity-framework

在实体框架中,使用存储过程,我想使用乐观并发在我的表上执行更新.在没有修改现有更新存储过程的情况下,我一直无法使用它.我正在尝试确定是否有一种方法可以映射现有的存储过程,以便在没有更新行时发生并发异常.

一些背景资料:

  • 我已经在我的.edmx文件中映射了更新存储过程(包括时间戳)列
  • 我现有的存储过程如下所示(显然省略了实际的表名和列):

    UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
    WHERE PK = @PK AND Timestamp = @Timestamp
    
    SELECT PK, Column1, Column2, ....., Timestamp
    FROM Table WHERE PK = @PK
    
    Run Code Online (Sandbox Code Playgroud)
  • 在该更新失败(由于时间戳不匹配)的情况下的存储过程的选定部分仍然返回一行.

当我将存储过程修改为以下内容时:

   UPDATE Table SET Column = @Column1, Column2 = @Column2 ....
   WHERE PK = @PK AND Timestamp = @Timestamp

   IF @@ROWCOUNT > 0
       SELECT PK, Column1, Column2, ....., Timestamp
       FROM Table WHERE PK = @PK
Run Code Online (Sandbox Code Playgroud)

然后一切都按预期工作,并发生并发错误.

或者,如果我使存储过程返回一个输出参数,并将该输出参数映射到Entity Framework的.edmx文件中的"Rows Affected Parameter",那么并发错误也会按预期工作.

这个解决方案(即使用输出参数)最好解释,我发现,这里:http: //petermannerhult.wordpress.com/2010/10/01/entity-framework-4-with-optimistic-concurrency-and-stored-程序/

上述两个步骤似乎都不应该是必要的,因为我认为实体框架可以只使用更新的行数来确定它是否应该引发并发异常.我在ADO.NET DataSet中使用了这些完全相同的存储过程(带有乐观并发),没有任何问题.所以我的问题是如何在不修改的情况下使用我现有的存储过程来实现实体框架中的乐观并发?

Mal*_*nis -1

如果您确实不想更改存储过程代码,可以将从存储过程返回的时间戳与传递到其中的时间戳进行比较。如果不同,那么就会出现并发错误。