首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架(MySQL) -使用两个dbcontexts将数据从一个数据库移动到另一个数据库

实体框架(MySQL) -使用两个dbcontexts将数据从一个数据库移动到另一个数据库
EN

Stack Overflow用户
提问于 2018-07-04 07:47:16
回答 2查看 58关注 0票数 0

使用EntityFramework6和MySQL,我尝试将数据从“生产”数据库表归档到“归档”数据库。我为每个数据库创建了两个DBContexts --一个。每个数据库都有相同的架构。

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

代码语言:javascript
复制
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();
    }  
}

但是,我不想对整个表进行归档,我只希望存档比某个日期更早的数据,因此我尝试了以下方法:

代码语言:javascript
复制
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实例引用。”

它发生在这一行上:

代码语言:javascript
复制
archiveContext.myTable.AddRange(dataToArchive); 

是否有可能从“dataToArchive”中删除跟踪

EN

回答 2

Stack Overflow用户

发布于 2018-07-04 08:18:16

在检索数据之后,您是否尝试过配置第一个DataContext?就像这样:

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2018-07-04 12:09:54

使用EF来管理归档数据并不理想,在数据库级别使用insert-select + delete来管理低到中等数据量或可拆的分区(即3-6mo)会更好。可以在数据库之间移动的分区大小。

要使用EF (仅推荐用于小型和非复杂域模型),您应该能够通过禁用读取上下文中的代理生成、加载数据AsNoTracking,然后将其添加到新的上下文DbSet来完成这一任务。此示例不处理关联实体,也不执行prod DbSet中的删除操作。

代码语言:javascript
复制
using (MyDBContext prodContext = 
        MyDBContext.CreateEntitiesForSpecificDatabaseName("prod_db"))
{
    prodContext.Configuration.ProxyCreationEnabled = false;
    dataToArchive = prodContext.myTable.AsNoTracking()
        .Where(mt => mt.Date < DateTimeSixMonths);


    using (MyDBContext archiveContext = 
        MyDBContext.CreateEntitiesForSpecificDatabaseName("archive_db"))
    {
        archiveContext.myTable.AddRange(dataToArchive);
        archiveContext.SaveChanges();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51168411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档