EF Core 获取 ID 的差异会导致 Instead Of Trigger 和 Scope_Identity 出现问题

EF Core differences for getting IDs causes issues with Instead Of Trigger and Scope_Identity

背景故事

我有一个应用程序正在尝试迁移到 .NET Core。这个应用程序经历了很多维护。为了尝试在原始应用程序正在使用时升级应用程序,它在大多数表上放置了数据库视图。

这些数据库视图使用 Instead Of 触发器。因此,当对视图执行插入时,触发器会将记录添加到正确的表中。

然而,当 Entity Framework 执行插入时,它会在之后添加一个 select 语句以获取任何 ID(以及任何生成的日期)。由于找不到更好的术语,我将其称为 "Turnaround Query"。 select 使用 Scope_Identity 找到正确的行。但实际插入发生在 Instead Of 触发器内。所以 Scope_Identity() returns null.

为了在正常(完整).Net 中解决这个问题,select 语句被添加到 Instead Of 触发器中。 Entity Framework 6 仍然会添加它的调用,但它会接受第一个结果并且很高兴。 (第二次调用的结果为空,但被忽略了。)

问题

现在我正在迁移到 .NET Core 3(和 EF Core)。当我 运行 一个插入语句时,它有两个结果集(就像它在普通(完整).NET Framework 中所做的那样)。

但是,此解决方法似乎不再有效。插入后出现以下错误:

Index was outside the bounds of the array.

我只能假设它现在正在查看第二组(我看不出任何其他错误原因)。

有没有办法告诉 .NET Core (EF Core) 如何查找其 "Turnaround Query" 的结果?

我想出了这个。 Entity Framework Core依旧拿第一名。但是 Entity Framework 6 愿意忽略一个缺失的列,其中 Entity Framework Core 给出了 "Index was outside the bounds of the array" 错误。

因此,如果您收到此错误,请查看 Entity Framework Core 期望的列(通过分析器(如 MiniProfiler))并确保它与您的 中的内容相匹配,而不是 触发器。