3

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

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は、挿入中にID列の値(intのデフォルト値)を使用していると思います。これがこの例外の原因です。テーブルのID列RoomTypesは自動的にインクリメントされ、テーブルの主キーでもあります。

ここで、挿入中にdapper.rainbowがID列を使用しないようにするにはどうすればよいですか。

4

1 に答える 1

3

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

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. のIDなしで基本クラスを作成してから、基本クラスをメソッドRoomTypesに渡します。Insert
  2. 動的パラメーターを作成Insertし、データベースに挿入するプロパティのみを含むメソッドに渡します。
  3. メソッドをオーバーライドしInsert、IDパラメータを削除してからに送信しますDapper
于 2012-12-28T03:14:56.103 に答える