У меня есть два файла SQLite, и я использую Entity Framework Core для обработки данных.
В принципе, у меня есть два контекста, которые имеют такую же структуру базы данных .
SourceDatabaseContext sourceDatabaseContext = new SourceDatabaseContext(file1);
TargetDatabaseContext targetDatabaseContext = new TargetDatabaseContext(file2);
Мне нужно скопировать большой объем данных из одного файла в другой (цель уже содержит данные, поэтому я не могу перезаписать их), но я стараюсь избегать использования объектов-сущностей.
Я знаю, что могу выполнять команды SQL с помощью метода Database.ExecuteSqlCommand()
контекстов, но я не знаю, как соединить эти два контекста.
Вот чего я бы хотел достичь:
targetDatabaseContext.Database.ExecuteSQLCommand("INSERT INTO Table1 SELECT * FROM sourceDatabase.Table1");
Я полагаю, что это похоже на использование кросс-контекстной команды SQL , но я не уверен, что это можно сделать или может быть альтернативное решение.
Что мне делать с этой проблемой?
UPDATE
Я добавил несколько методов, чтобы показать, как в данный момент выполняется сохранение Entity Framework.
public async Task Start()
{
try
{
SetBulkOperations(true);
await StartTransaction();
await SaveAllEntities();
CommitTransaction();
}
catch(Exception ex)
{
RollbackTransaction();
}
finally
{
SetBulkOperations(false);
}
}
public async Task StartTransaction() => await context.Database?.BeginTransactionAsync();
public void SetBulkOperations(bool isOn) => context.ChangeTracker.AutoDetectChangesEnabled = !isOn;
public void CommitTransaction() => context.Database?.CurrentTransaction?.Commit();
public void RollbackTransaction() => context.Database?.CurrentTransaction?.Rollback();
public async Task SaveAllEntities()
{
var logItems = await repository2.GetLogItems();
if(logItems.Count > 0)
await SaveListAsync(logItems, true);
//...and it goes on
}
public async Task SaveListAsync<TType>(List<TType> data, bool isNew) where TType : class
{
if (isNew)
await context.Set<TType>().AddRangeAsync(data);
await context.SaveChangesAsync();
}