查看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 属性的新类型才能传递给该方法。有几个想法浮现在脑海:
- 创建一个没有 ID 的基类
RoomTypes,然后将基类传递给Insert方法。
- 创建一个动态参数并将其传递给
Insert仅包含要插入数据库的属性的方法。
- 覆盖该
Insert方法并删除 ID 参数,然后再发送到Dapper