.NET 6中不使用Entity Framework同步SQL Server数据库的方法
数据库同步解决方案(无EF、字段名映射场景)
核心方案:基于System.Data.SqlClient手动实现增量同步
不用EF和过时框架的前提下,最可控的方式是自己编写同步逻辑,核心围绕增量数据拉取+字段映射转换+批量写入展开:
1. 先搞定增量标识(关键前提)
如果允许给两张表新增一个无业务影响的字段,优先加LastUpdated(datetime类型,默认取当前时间,更新时自动刷新);如果完全不能改表结构,就用现有唯一标识字段(比如phone/x_phone)结合上次同步时间,来筛选增量数据。
2. 字段映射配置
先定义字段对应关系,避免硬编码:
var fieldMapping = new Dictionary<string, string> { {"Name", "x_Name"}, {"address", "x_address"}, {"phone", "x_phone"} };
3. 同步流程示例(从服务器1同步到服务器2)
步骤1:拉取服务器1的增量数据
// 假设lastSyncTime是上次同步完成的时间,可存在配置文件或数据库中 string queryServer1 = @"SELECT Name, address, phone FROM employee WHERE LastUpdated > @LastSyncTime"; DataTable syncData = new DataTable(); using (var conn = new SqlConnection(server1ConnString)) { conn.Open(); using (var cmd = new SqlCommand(queryServer1, conn)) { cmd.Parameters.AddWithValue("@LastSyncTime", lastSyncTime); syncData.Load(cmd.ExecuteReader()); } }
步骤2:转换字段并写入服务器2
用SQL Server的MERGE语句处理新增+更新逻辑,保证数据一致性:
using (var conn = new SqlConnection(server2ConnString)) { conn.Open(); using (var tran = conn.BeginTransaction()) { try { foreach (DataRow row in syncData.Rows) { string mergeSql = @"MERGE x_employee AS target USING (VALUES (@Name, @Address, @Phone)) AS source (x_Name, x_address, x_phone) ON target.x_phone = source.x_phone WHEN MATCHED THEN UPDATE SET x_Name = source.x_Name, x_address = source.x_address WHEN NOT MATCHED THEN INSERT (x_Name, x_address, x_phone) VALUES (source.x_Name, source.x_address, source.x_phone);"; using (var cmd = new SqlCommand(mergeSql, conn, tran)) { cmd.Parameters.AddWithValue("@Name", row["Name"]); cmd.Parameters.AddWithValue("@Address", row["address"]); cmd.Parameters.AddWithValue("@Phone", row["phone"]); cmd.ExecuteNonQuery(); } } tran.Commit(); // 更新同步时间 lastSyncTime = DateTime.Now; } catch (Exception ex) { tran.Rollback(); // 这里加异常日志或告警逻辑 } } }
4. 优化建议
- 批量操作提速:如果数据量较大,用
SqlBulkCopy先把转换后的数据写入临时表,再用MERGE同步到正式表,比逐条插入效率高很多 - 定时执行:用Windows服务、Hangfire或任务计划程序,定期触发同步逻辑
- 双向同步:如果需要双向同步,分别处理两边的增量数据,冲突处理可优先保留时间戳最新的记录
关于你提到的框架说明
- Microsoft Sync Framework已停止官方维护,生产环境不建议使用
- DotMimSync若要尝试,重点关注其字段映射配置和增量同步核心逻辑,但需自行评估社区支持不足带来的风险
内容的提问来源于stack exchange,提问作者avdeveloper
相关产品推荐
相关产品推荐

