代码之家  ›  专栏  ›  技术社区  ›  vicky kumar

Dapper Contrib InsertAsync<T>不返回上次插入的Id

  •  0
  • vicky kumar  · 技术社区  · 2 年前

    我有这样的代码:

    db.Insert(myObject);
    

    该类型的键 myObject 是一种 System.Guid 这是由RDBMS自动生成的。

    然后,我想插入将使用该键与其父对象关联的子对象。

    foreach(var child in myObject.ChildObjects) {
       child.ParentId = parentIdThatISomehowSaved; //this is what I don't know how to do
       db.Insert(child);
    }
    

    我正在分配一个新的任务 Guid 当插入发生时,通过SQL Server访问记录。

    获取新记录Id的最佳方法是什么,以便我可以将其作为外键填充到子对象上?这个 Dapper.Contrib.Extensions.Insert 方法返回 long 那么,有没有一种方法可以让这项工作与 指南 ?

    0 回复  |  直到 2 年前
        1
  •  3
  •   Amit Joshi    2 年前

    更新:2022年5月2日

    从…起 source code ,看来这项功能现在已经实现了。 不过我还没有测试过。
    看来 Insert<T> 方法会 回来 (它不会映射到实体属性)新生成的数字ID(方法的返回类型为 long )如果只插入一个实体。如果要插入实体列表,它将返回插入的行数。

    我不确定 这将如何与 GUID 身份证 .

    以下是代码注释:

    /// Inserts an entity into table "Ts" and returns identity id or number of inserted rows if inserting a list.  
    ...  
    ...  
    /// <returns>Identity of inserted entity, or number of inserted rows if inserting a list</returns>
    

    此外,请遵守 code 插入单个实体,并应根据上面的代码注释返回新生成的ID:

    if (!isList)    //single entity
    {
        returnVal = adapter.Insert(connection, transaction, commandTimeout, name, sbColumnList.ToString(),
        sbParameterList.ToString(), keyProperties, entityToInsert);
    }
    else
    {
        //insert list of entities
        var cmd = $"insert into {name} ({sbColumnList}) values ({sbParameterList})";
        returnVal = connection.Execute(cmd, entityToInsert, transaction, commandTimeout);
    }
    

    原始答案:

    这个 Insert Dapper Contrib的方法不会返回新生成的ID。这是因为Contrib是在Dapper上构建的,而Dapper不会将新生成的ID映射到实体 默认情况下 它也不归还。但是有办法 回来 使用Dapper新生成的ID。讨论了这些问题 here , here here .

    Dapper扩展(Dapper的其他查询生成器)默认情况下支持此功能。请参阅 this 回答更多细节。

    一种方法是绕过Contrib,使用Dapper;使用链接中介绍的任何方式获取新生成的ID( OUTPUT 参数或 @@IDENTITY 等等)。

    使用Contrib实现这一点的另一种方法是通过单独调用 矮小利落的 (如链接中所述; @@身份 )在打电话给 插入 .

    第三种方法是显式分配ID,而不是自动生成ID。你可以用 [ExplicitKey] 属性来实现这一点。您还需要相应地更改数据库。

    [Key] 应用于数据库生成的键(例如自动增量列),而 [ExplicitKey] 应该用于代码中生成的显式键。

    更积极的解决方案是修改Contrib代码,使 插入 返回新生成的ID。

    顺便说一下,我找到了一个 issue 与你的问题相似;看看这是否对你有帮助。