背景故事
我有一个应用程序,我正在尝试迁移到 .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((,并确保它与而不是触发器中的内容匹配。