3

我正在使用 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是自动递增的,它也是我的表的主键。

现在,我如何阻止 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 回答