EF6自动为CRUD创建存储过程

时间:2013-09-10 12:13:42

标签: c# sql sql-server entity-framework stored-procedures

很抱歉很长的解释但是简短的问题。如有问题,您可以直接查看除此之外的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服务器的RowVersion作为concurency令牌,当然是“Database Generated Concurency”。

首先:我自己创建了相关的存储过程。我拒绝了EF6文档Stored Procedure Mapping

然后: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

我的问题在这一点上来了:

IN 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的输出参数。 我必须更改自动处理的存储过程以遵循文档,或文档被破坏?或者一切都在窗帘之下。

0 个答案:

没有答案