使用ExecuteSqlRawcommandText插入后未跟踪EF Core Repository项目

问题描述

由于性能上的优势,我通过执行原始sql命令来插入数据。 所有数据均已正确插入数据库,但存储库不知道它们已插入。基本上, usersBeforeInsert usersAfterInsert 包含相同的3条记录。

此外,在应用程序重新启动后,存储库仍不知道使用ExecutesqlRaw()插入的用户,仅检索ExecutesqlRaw()之前存在的用户

有人知道如何使_userRepository从db检索所有数据吗?顺便说一句,我正在使用asp.net样板项目。

下面是代码示例:

var usersBeforeInsert = await _userRepository.GetAllListAsync();      // 3
var commandText = GenerateInsertUseRSSqlScript(users);
var context = _userRepository.GetDbContext();
var rowsAffected = context.Database.ExecutesqlRaw(commandText);       // 85000
context.SaveChange()
var usersAfterInsert = await _userRepository.GetAllListAsync();      // 3

解决方法

您的罪魁祸首是此行

var usersBeforeInsert = await _userRepository.GetAllListAsync();

因为该框架假定此行和此行之间没有任何变化

var usersAfterInsert = await _userRepository.GetAllListAsync();

您可以通过在原始插入之后才调用列表来解决此问题,或者可以清除更改集。

清除变更集的最简单方法是建立一个新的_userRepository,但我想它很有可能被注入。