2

長い説明で申し訳ありませんが、短い質問です。質問については、これ以外の 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 という名前の出力パラメーターはありません。ドキュメントに従うように自動作成されたストアド プロシージャを変更する必要がありますか、それともドキュメントが壊れていますか? または、すべてがカーテンの下に入ります。

4

0 に答える 0