gpt4 book ai didi

c# - 禁止 dapper.rainbow 在插入时使用 ID

转载 作者:行者123 更新时间:2023-11-30 22:21:58 36 4
gpt4 key购买 nike

我正在使用 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 列。

最佳答案

查看 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. 在发送到 Dapper 之前覆盖 Insert 方法并删除 ID 参数

关于c# - 禁止 dapper.rainbow 在插入时使用 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14040970/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com