首页 > 解决方案 > 实体框架 (MySQL) - 使用两个 dbcontexts 将数据从一个数据库移动到另一个数据库

问题描述

使用 Entity Framework 6 和 MySQL,我正在尝试将数据从“生产”数据库表存档到“存档”数据库。我为每个数据库创建了两个 DBContext。每个数据库都有相同的模式。

我可以使用以下代码将整个数据表从生产数据库移动到存档数据库:

using (MyDBContext archiveContext = 
MyDBContext.CreateEntitiesForSpecificDatabaseName("archive_db"))
using (MyDBContext prodContext = 
MyDBContext.CreateEntitiesForSpecificDatabaseName("prod_db"))
{
    if(prodContext.myTable.Any())
    {
        archiveContext.myTable.AddRange(prodContext.myTable.AsNoTracking());
        archiveContext.SaveChanges();
    }  
}

但是我不想归档整个表,我只想归档早于某个日期的数据,所以我尝试了以下方法:

using (MyDBContext archiveContext = 
MyDBContext.CreateEntitiesForSpecificDatabaseName("archive_db"))
using (MyDBContext prodContext = 
MyDBContext.CreateEntitiesForSpecificDatabaseName("prod_db"))
{
    IQueryable<myTable> dataToArchive =
      from mt in prodContext.myTable
      where mt.date < DateTimeSixMonths
      select mt;

     archiveContext.myTable.AddRange(dataToArchive);
     archiveContext.SaveChanges();
}       

但我无法绕过运行此程序时遇到的异常:

System.InvalidOperationException:“一个实体对象不能被多个 IEntityChangeTracker 实例引用。”

它发生在这一行:

archiveContext.myTable.AddRange(dataToArchive); 

是否有可能以某种方式从“dataToArchive”中删除跟踪

标签: mysql.netentity-framework

解决方案


您是否尝试在检索数据后处理第一个 DataContext ?像这样的东西:

List<myTable> dataToArchive;

using (MyDBContext prodContext = 
        MyDBContext.CreateEntitiesForSpecificDatabaseName("prod_db"))
{

    dataToArchive = (from mt in prodContext.myTable
        where mt.date < DateTimeSixMonths
        select mt).ToList();
}

using (MyDBContext archiveContext = 
    MyDBContext.CreateEntitiesForSpecificDatabaseName("archive_db"))
{
    archiveContext.myTable.AddRange(dataToArchive);
    archiveContext.SaveChanges();
}

推荐阅读