You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:00:08