mysql - 实体框架 (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”中删除跟踪
解决方案
您是否尝试在检索数据后处理第一个 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();
}
推荐阅读
- angular - ionic 4 native http获取空数组
- html - HTML表格显示问题
- perl - 调用子程序时的perl自动生存
- kubernetes - 限制网格内的 Istio 服务
- segue - Swift - 仅在 TouchID 身份验证后进行 Segue
- javascript - 如何通过 selenium 获取 Chrome 性能工具摘要
- matlab - 如何在matlab中计算总和
- javascript - 尝试转换为日期时获取 RangeError Invalid Date
- json - 如何在 Azure Cosmos DB 中“合并”或“转换”JSON 文档
- python - 使用 get_context_data 从 url 获取数据创建详细视图