EF6实现从结构相同的DB1向DB2新增数据行的方法
跨数据库表数据导入解决方案
你的代码存在两个关键问题:一是列表类型声明错误导致无法正常访问元素,二是不同DbContext对应的实体类不能直接通过构造函数转换。以下是修正后的完整实现:
// 明确指定列表类型为DB1的实体类 List<table_local> pendingRowsList; // 从DB1获取数据 using (var context = new DB1()) { pendingRowsList = context.table_local .OrderByDescending(x => x.id) .Take(numberOfRows) .ToList(); } // 批量导入DB2 using (var context = new DB2()) { foreach (var localRow in pendingRowsList) { // 手动映射属性(因为table_local和table_remote是不同实体) var remoteRow = new table_remote() { id = localRow.id, // 这里把table_local的所有属性对应复制到table_remote,比如: // name = localRow.name, // createTime = localRow.createTime, // ... 其他属性 }; context.table_remote.Add(remoteRow); } // 批量提交,提升效率 context.SaveChanges(); }
关键修正点说明:
- 修正列表类型:将
pendingRowsList的类型从object改为List<table_local>,这样才能正常遍历和访问列表中的元素,避免编译错误。 - 实体属性映射:由于
table_local属于DB1上下文,table_remote属于DB2上下文,二者是完全独立的类,无法直接转换。需要手动将table_local的每个属性值复制到table_remote的实例中。如果属性数量较多,可以用反射或者AutoMapper工具简化映射逻辑。 - 优化插入性能:原代码在循环内每次调用
SaveChanges()会频繁和数据库交互,效率极低。改为循环内批量添加实体,最后一次性提交,能大幅提升导入速度。
可选简化方案(AutoMapper)
如果属性完全一致,可使用AutoMapper自动完成映射:
- 安装AutoMapper NuGet包:
Install-Package AutoMapper - 配置映射并转换:
// 配置映射(全局配置一次即可) var config = new MapperConfiguration(cfg => cfg.CreateMap<table_local, table_remote>()); var mapper = config.CreateMapper(); // 导入时直接转换 using (var context = new DB2()) { var remoteRows = pendingRowsList.Select(mapper.Map<table_remote>).ToList(); context.table_remote.AddRange(remoteRows); context.SaveChanges(); }
内容的提问来源于stack exchange,提问作者Jaume
相关产品推荐
相关产品推荐

