我有两个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();
}