挿入中にdapper.rainbowがIDを使用しないようにする

c# dapper dapper-rainbow sql

質問

私はdapper.rainbowを使用してMSSQLデータベースにレコードを挿入しています。以下は私のコードです

int? id  = db.RoomTypes.Insert(roomType)

私は私のアプリを実行すると、私は以下の例外を取得しています。

Cannot insert explicit value for identity column in table 'RoomTypes' 
when IDENTITY_INSERT is set to OFF.

私はdapper.rainbowが挿入中に私のアイデンティティ列の値(intのデフォルト値)を使用していると思います。これがこの例外の原因です。 RoomTypesテーブルのID列は自動的にインクリメントされ、テーブルのプライマリキーにもなります。

今、挿入中にIDカラムを使用することをdapper.rainbowが止めるにはどうしたらいいですか?

受け入れられた回答

Dapper.Rainbow.Insertメソッドを見ると、このメソッドはdataパラメータとして渡された型に "ダム"します。

public virtual int? Insert(dynamic data)
{
    var o = (object)data;
    List<string> paramNames = GetParamNames(o);

    string cols = string.Join(",", paramNames);
    string cols_params = string.Join(",", paramNames.Select(p => "@" + p));
    var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + cols_params + ") select cast(scope_identity() as int)";

    return database.Query<int?>(sql, o).Single();
}

言い換えれば、パラメータにIDをプロパティとして含めると、Dapperはその値をデータベースに挿入しようとします。あなたが見たように、IDENTITY_INSERTをOffに設定すると、挿入は失敗します。

つまり、メソッドに渡すIDプロパティを含まない新しい型を作成する必要があります。いくつかのアイデアが思い浮かぶ:

  1. RoomTypesのIDを持たない基本クラスを作成し、基本クラスをInsertメソッドに渡します。
  2. 動的パラメータを作成し、データベースに挿入するプロパティのみを使用してInsertメソッドに渡します。
  3. Dapperに送信する前に、 InsertメソッドをオーバーライドしてIDパラメータを削除する


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ