Как вставить данные с помощью выбора из другого контекста в Entity Framework Core - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть два файла 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...