我正在使用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列。
答案 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属性的新类型以传递给该方法。我想到了一些想法:
RoomTypes
ID的基类,然后将基类传递给Insert
方法。Insert
方法,只包含要插入数据库的属性。Insert
方法并删除ID参数,然后发送至Dapper