感谢@Eduardo Molteni,你让我走上了解决这个问题的正确道路。显然,SQL Server 2008 R2 中的一个已知问题是,如果表具有触发器,则插入中的 OUTPUT 命令将失败。但是,PetaPoco 会自动将 OUTPUT 子句插入到表具有 AutoIncrement=true 的任何插入的命令文本中。
我的解决方案(对于 SQL Server 2008 R2)如下:
1)进入PetaPoco.DatabaseTypes.SqlServerDatabaseType.GetInsertOutputClause函数
删除(注释掉)\\return String.Format(" OUTPUT INSERTED.[{0}]", primaryKeyName);
这将从 SQL 插入语句中删除“OUTPUT”。现在,插入将发生在带有触发器的表上。但是,现在 PetaPoco 无法从新插入的行中检索新的主键(身份)。
2)转到PetaPoco.Database.Insert函数。就在该行上方:
object id = _dbType.ExecuteInsert(this, cmd, primaryKeyName);
添加一个新行,所以它看起来像这样:
cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;";
object id = _dbType.ExecuteInsert(this, cmd, primaryKeyName);
新行(存在于 PetaPoco 中,但未使用)将允许插入语句检索身份。