長い説明で申し訳ありませんが、短い質問です。質問については、これ以外の 2 つの太字のテキストを直接見ることができます。
新しい機能を学ぶために、最初の EF6 CODE FIRST プロジェクトを作成しました。新しいストアド プロシージャ ベースの CRUD 操作を実装しようとしました。
ここでのデモ用のモデル エンティティの 1 つが次のようになります。
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 を同時実行トークンとして使用します。これはもちろん「データベース生成同時実行」です。
最初に: 自分で releted ストアド プロシージャを作成しました。私は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
私の問題はこの時点で発生しました:
IN EntityFramework 6 ドキュメント ページの「同時実行トークン」セクションには、次のように記載されています。
同時実行トークン
- ストアド プロシージャの更新と削除では、同時実行も処理する必要がある場合があります。
- エンティティに同時実行トークンが含まれている場合、ストアド プロシージャには、更新/削除された行数を返す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 という名前の出力パラメーターはありません。ドキュメントに従うように自動作成されたストアド プロシージャを変更する必要がありますか、それともドキュメントが壊れていますか? または、すべてがカーテンの下に入ります。