Все, что вам нужно сделать, возможно, это иметь локальную временную базу данных, которая имеет ту же структуру, что и ваша основная (удаленная) база данных; затем выполните SaveChanges в локальной базе данных, а не в основной базе данных.
Чтобы направить SaveChanges к локальной базе данных вместо основной, при создании DbContext вам просто потребуется использовать другую строку подключения. (Хотя было некоторое обсуждение возможности изменить соединение в DbContext, в настоящее время оно не реализовано, см. https://github.com/aspnet/EntityFrameworkCore/issues/8494.).
Итак ... скажем, ваши изменения находятся в "основном" DbContext, вы затем создаете второй DbContext для локальной базы данных и просто копируете изменения из основного "DbContext.ChangeTracker" в "локальный" DbContext. ChangeTracker. Вы можете сделать это, перебирая записи ChangeTracker и: клонируйте сущность (создайте сущность и скопируйте все значения из EntityEntry.OriginalValues, используя PropertyInfo.SetValue); прикрепить объект к «локальному» DbContext; затем примените изменения (получите текущее значение, используя EntityEntry.CurrentValues, проверьте на! EqualityComparer.Default.Equals и, если не равно, снова используйте PropertyInfo.SetValue, чтобы применить текущее значение).
Это довольно просто, если вам нужна только мелкая копия; если вам нужна глубокая копия, вам также нужно будет перемещаться по отношениям, которые есть в модели.
В качестве альтернативы всему этому другой подход состоял бы в том, чтобы всегда сохранять все в локальной базе данных и затем иметь отдельный процесс, такой как пакетный процесс, который копирует значения в основную базу данных. В качестве общего комментария, независимо от того, как вы это сделаете, вам придется иметь дело с любыми конфликтами параллелизма, которые могут возникнуть, когда локальные значения отправляются в основную базу данных.
Steve
P.S. Возможно, стоит поэкспериментировать с DbContext.Database, чтобы увидеть, можете ли вы перенаправить соединение - если вы хотите выйти за пределы «поддерживаемого» API.