如何从Entity Framework Core中的不同上下文中选择插入数据

时间:2019-04-16 11:45:00

标签: c# sqlite entity-framework-core

我有两个SQLite文件,我使用Entity Framework Core来处理数据。

基本上,我有两个上下文具有相同的数据库结构。

SourceDatabaseContext sourceDatabaseContext = new SourceDatabaseContext(file1);
TargetDatabaseContext targetDatabaseContext = new TargetDatabaseContext(file2);

我需要将大量数据从一个文件复制到另一个文件(目标已经包含数据,所以我不能覆盖它),但是我尽量避免使用实体对象。

我知道我可以使用上下文的Database.ExecuteSqlCommand()方法执行SQL命令,但是我不知道如何连接这两个上下文。

这是我想要实现的:

targetDatabaseContext.Database.ExecuteSQLCommand("INSERT INTO Table1 SELECT * FROM sourceDatabase.Table1"); 

我想这就像跨上下文SQL命令用法一样,但是我不确定是否可以完成或者是否有替代解决方案。

该问题该怎么办?

更新

我添加了一些方法来显示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();
}

0 个答案:

没有答案