1

我有这样的代码:

db.Insert(myObject);

类型的键myObject是 type System.Guid

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

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方法返回 a long,那么有没有办法让它与 a 一起工作Guid

4

1 回答 1

2

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

Dapper Extensions(Dapper 的其他查询生成器)默认支持此功能。有关详细信息,请参阅此答案。

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

使用 Contrib 执行此操作的其他方法是在调用.@@IDENTITYInsert

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

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

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

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

于 2021-08-06T09:08:20.370 回答