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

DotMim.Sync配置TenantID过滤条件后同步忽略过滤规则问题

DotMim.Sync配置TenantID过滤条件后同步忽略过滤规则问题

嘿,我之前用DotMim.Sync做多租户同步的时候也踩过这个一模一样的坑!明明想着要按TenantID过滤,结果同步还是把全量数据拉下来了,折腾好一阵才搞明白问题出在哪。给你梳理几个关键的排查和解决点:

1. 别漏了创建并绑定SyncFilter实例

你只提到了设置SyncSetup和同步方向,但实际上要让过滤生效,得显式创建过滤规则并绑定到对应表上,不是只靠脑子里的WHERE tenantID = @myVariable逻辑就行。给你贴个实际可复用的代码片段:

var setup = new SyncSetup("dbo.Tenants", "dbo.Devices", "dbo.Audios");

// 先配置好同步方向
setup.Tables["dbo.Tenants"].SyncDirection = SyncDirection.DownloadOnly;
setup.Tables["dbo.Devices"].SyncDirection = SyncDirection.DownloadOnly;
setup.Tables["dbo.Audios"].SyncDirection = SyncDirection.DownloadOnly;

// 重点:创建TenantID的过滤规则,参数名要和后面传入的变量对应上
var tenantFilter = new SyncFilter("TenantID", "myVariable");

// 给需要过滤的关联表绑定规则(比如Devices、Audios这些依赖TenantID的表)
setup.Filters.Add("dbo.Devices", tenantFilter);
setup.Filters.Add("dbo.Audios", tenantFilter);

// 要是Tenants表也只需要同步当前租户的记录,别忘了也加上过滤
setup.Filters.Add("dbo.Tenants", tenantFilter);

2. 同步时必须传入实际的TenantID参数

光配置过滤规则还不够,执行同步的时候得把具体的租户GUID值传进去,不然DotMim.Sync不知道用什么替换@myVariable,自然就直接忽略过滤规则了:

// 初始化同步代理
var agent = new SyncAgent(clientProvider, serverProvider, setup);

// 替换成你的实际租户GUID
agent.Parameters.Add("myVariable", Guid.Parse("你的租户唯一标识GUID"));

// 执行同步操作
var syncResult = await agent.SynchronizeAsync();

几个容易踩的小坑要留意

  • 列名拼写要完全一致:确认数据库里的列名是TenantID(别是tenantid或者TenantId),代码里的列名必须和数据库完全匹配
  • 租户主表的过滤需求:如果你只需要同步当前租户的记录,dbo.Tenants表也得加过滤;要是要同步所有租户(虽然你设了DownloadOnly),那可以跳过这步
  • 清理元数据缓存:如果之前已经同步过全量数据,客户端的元数据缓存可能会干扰新的过滤规则,试试先调用await agent.CleanMetadatasAsync()再重新同步
  • 查看执行SQL:开启DotMim.Sync的日志功能,能看到实际发送到数据库的SQL语句,确认WHERE TenantID = @myVariable有没有被正确拼接进去,这是快速定位问题的好办法

按上面的步骤调整配置后,过滤规则应该就能正常生效了,你可以试试重新同步看看!

备注:内容来源于stack exchange,提问作者Dorathoto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:48:10