获取 ID 的 EF Core 差异会导致"代替触发器"和"Scope_Identity&



背景故事

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

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

但是,当实体框架执行插入时,它会在后面添加一个 select 语句,以获取任何 ID(以及任何生成的日期(。 由于缺乏更好的术语,我称之为"周转查询"。 此选择使用 Scope_Identity 来查找正确的行。 但实际插入发生在而不是触发器内。 所以Scope_Identity()返回 null。

为了在普通(完整(.Net 中解决此问题,将 select 语句添加到InsteadNot 触发器中。 实体框架 6 仍会添加其调用,但它将采用第一个结果并感到满意。 (第二个调用的结果为空,但被忽略。

问题

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

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

索引超出数组的范围。

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

有没有办法告诉.NET Core(EF Core(如何查找其"周转查询"的结果?

我想通了这个。 实体框架核心仍采用第一个结果。 但实体框架 6 愿意忽略缺少的列,其中实体框架核心给出了"索引超出数组边界"错误。

因此,如果收到此错误,请查看实体框架核心期望的列(通过探查器(如 MiniProfiler((,并确保它与而不是触发器中的内容匹配。

相关内容

  • 没有找到相关文章

最新更新