抱歉,解释很长,但问题很短。对于问题,您可以直接查看除此之外的 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 的输出参数。我必须更改自动创建的存储过程以遵循文档,或者文档已损坏?或者一切都在窗帘下。