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
相关产品推荐
相关产品推荐

