2

抱歉,解释很长,但问题很短。对于问题,您可以直接查看除此之外的 2 个粗体样式的文本。

我创建了我的第一个 EF6 CODE FIRST 项目来学习新功能。我试图实现新的基于存储过程的 CRUD 操作。

此处演示的模型实体之一,如下所示:

public partial class POCO
{
    //identy
    public int ID { get; set; }

    // SQL Server Timestamp
    // this.Property(t => t.RowVersion).IsFixedLength().HasMaxLength(8).IsRowVersion();
    public byte[] RowVersion { get; set; }

    public int MiscPropery { get; set; }    
}

该实体使用 SQL server 的 RowVersion 作为并发令牌,当然是“数据库生成的并发”。

首先:我自己创建了相关的存储过程。我将 EF6 文档存储过程映射闲置了

然后:EntityFramework 6 创建数据库和存储过程。

EntityFramework 6 created insert stored procedure:

CREATE PROCEDURE [dbo].[POCO_Update]
    @ID [int],
    @RowVersion_Original [rowversion],
    @MiscPropery  [int]
    --                  ------- I hope here: @RowsAffected int OUTPUT 

AS
BEGIN
    UPDATE [dbo].[POCOs]
    SET [MiscPropery] = @MiscPropery  
    WHERE (([ID] = @ID) AND (([RowVersion] = @RowVersion_Original) 
            OR ([RowVersion] IS NULL AND @RowVersion_Original IS NULL)))

    SELECT t0.[RowVersion], t0.[FaturaNo]
    FROM [dbo].[POCOs] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[ID] = @ID
END


EntityFramework 6 created delete stored procedure:

CREATE PROCEDURE [dbo].[POCO_Delete]
    @ID [int],
    @RowVersion_Original [rowversion]
    --                   ------- I hope here: @RowsAffected int OUTPUT 
AS
BEGIN
    DELETE [dbo].[POCOs]
    WHERE (([ID] = @ID) AND (([RowVersion] = @RowVersion_Original) 
          OR ([RowVersion] IS NULL AND @RowVersion_Original IS NULL)))
END

我的问题出现在这一点上:

在 EntityFramework 6 文档页面中,在“并发令牌”部分中说:(http://entityframework.codeplex.com/wikipage?title=Code%20First%20Insert%2fUpdate%2fDelete%20Stored%20Procedure%20Mapping

并发令牌

  • 更新和删除存储过程可能还需要处理并发:
  • 如果实体包含任何并发标记,则存储过程应该有一个名为 RowsAffected 的输出参数,该参数返回更新/删除的行数。

并在该文档页面上提供这些示例:

// from documentation page
public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  [Timestamp]
  public byte[] Timestamp { get; set; }
}

CREATE PROCEDURE [dbo].[Person_Update] 
  @PersonId int, 
  @Name nvarchar(max), 
  @Timestamp_Original rowversion, 
  @RowsAffected int OUTPUT      -- ====> !!!!!
AS 
BEGIN
  UPDATE [dbo].[People]
  SET [Name] = @Name   
  WHERE PersonId = @PersonId AND [Timestamp] = @Timestamp_Original   

  SET @RowsAffected = @@RowCount 
END

但是 EF6 创建的存储过程中没有名为 RowsAffected 的输出参数。我必须更改自动创建的存储过程以遵循文档,或者文档已损坏?或者一切都在窗帘下。

4

0 回答 0