使用EntityFramework6和MySQL,我尝试将数据从“生产”数据库表归档到“归档”数据库。我为每个数据库创建了两个DBContexts --一个。每个数据库都有相同的架构。
我可以使用以下代码将整个数据表从生产数据库移动到归档数据库:
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”中删除跟踪
发布于 2018-07-04 08:18:16
在检索数据之后,您是否尝试过配置第一个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();
}发布于 2018-07-04 12:09:54
使用EF来管理归档数据并不理想,在数据库级别使用insert-select + delete来管理低到中等数据量或可拆的分区(即3-6mo)会更好。可以在数据库之间移动的分区大小。
要使用EF (仅推荐用于小型和非复杂域模型),您应该能够通过禁用读取上下文中的代理生成、加载数据AsNoTracking,然后将其添加到新的上下文DbSet来完成这一任务。此示例不处理关联实体,也不执行prod DbSet中的删除操作。
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();
}
}https://stackoverflow.com/questions/51168411
复制相似问题