插入时禁用dapper.rainbow使用ID

时间:2012-12-26 13:03:16

标签: c# sql dapper dapper-rainbow

我正在使用dapper.rainbow将记录插入MSSQL db。以下是我的代码

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的我的标识列是自动递增的,它也是我表的主键。

现在,如何在插入过程中阻止dapper.rainbow使用ID列。

1 个答案:

答案 0 :(得分: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. 创建一个没有RoomTypes ID的基类,然后将基类传递给Insert方法。
  2. 创建一个动态参数,并将其传递给Insert方法,只包含要插入数据库的属性。
  3. 覆盖Insert方法并删除ID参数,然后发送至Dapper