【问题标题】:How do I get back the key for a newly inserted record using Dapper.Contrib?如何获取使用 Dapper.Contrib 插入的新记录的 GUID 键?
【发布时间】:2021-08-05 14:41:36
【问题描述】:

我有这样的代码:

db.Insert(myObject);

myObject 类型的键是 System.Guid 类型。

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

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

当插入发生时,我正在通过 SQL Server 为记录分配一个新的Guid

获取新记录的 ID 以便我可以将其填充为子对象的外键的最佳方法是什么? Dapper.Contrib.Extensions.Insert 方法返回一个long,那么有没有办法使用Guid 来实现它?

【问题讨论】:

    标签: c# dapper dapper-contrib


    【解决方案1】:

    Dapper Contrib 的 Insert 方法不会返回新生成的 ID。这是因为 Contrib 是基于 Dapper 构建的,Dapper 既不将新生成的 ID 映射到实体默认情况下,也不返回它。但是有一些方法可以返回使用 Dapper 新生成的 ID。讨论了hereherehere

    Dapper Extensions(Dapper 的其他查询生成器)默认支持此功能。详情请参考this答案。

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

    使用 Contrib 执行此操作的其他方法是在调用 Insert 后立即单独调用 Dapper(如链接中所述;@@IDENTITY)来获取新生成的 ID。

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

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

    更激进的解决方法是修改Contrib代码,让Insert返回新生成的ID。

    顺便说一下,我发现 [https://github.com/DapperLib/Dapper.Contrib/issues/58] 问题与您的问题相似;看看对你有没有帮助。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多