c# - 在 Entity Framework 中使用存储过程的乐观并发

标签 c# entity-framework

在 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
    
  • 如果更新失败(由于时间戳不匹配),存储过程的选择部分仍返回一行。

当我修改存储过程如下:

   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

然后一切正常,并发错误。

或者,如果我让存储过程返回一个输出参数,并将该输出参数映射到 Entity Framework 的 .edmx 文件中的“受影响的行参数”,那么并发错误也会按预期工作。

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

尽管上述步骤似乎都不是必需的,因为我假设 Entity Framework 可以只使用更新的行数来确定它是否应该引发并发异常。我在 ADO.NET 数据集中使用了这些完全相同的存储过程(具有乐观并发性),没有任何问题。所以我的问题是如何在不修改的情况下使用现有的存储过程在 Entity Framework 中启用乐观并发?

最佳答案

在 EDMX 设计器的存储过程映射窗口中,每个属性旁边有两个复选框。 使用原始值行影响参数。如您所述,Rows Affected Parameter 要求您在 proc 中使用输出参数。但是,如果您为时间戳选择 Use Original Value,它会比较它们并在两者不匹配时抛出 OptimisticConcurrencyException。这应该允许您在无需修改过程的情况下获得异常。

关于c# - 在 Entity Framework 中使用存储过程的乐观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497980/

相关文章:

c# - Windows 窗体组合框中的复杂数据绑定(bind)

c# - 如何选择异步委托(delegate)的返回类型

mysql - MySQL 连接器的 Entity Framework 6.x 问题

c# - 如何将 EF 核心迁移添加到 .net 核心 2 类库?

sql - 在 Entity Framework 中,创建投影而不是选择完整实体是否更有效/更受欢迎?

c# - 如何更改 VS2015 中的代码生成策略?

c# - 建议放置 make_public pragmas 的位置

c# - 进行 AES 加密 CBC

c# - wpf中的椭圆形按钮

c# - MVC EF——内部连接