修改Dynamics 365 CE汇总字段的最小值与最大值(本地部署)
解决Dynamics 365 CE托管汇总字段最小值/最大值修改问题
方案1:直接修改SQL数据库(本地部署专属)
本地部署环境可直接操作底层数据库,操作前务必完整备份数据库:
- 托管字段的元数据存储在
MetadataSchema.Attribute表中 - 通过字段逻辑名和对应实体ID定位目标记录,执行SQL修改最小值/最大值:
UPDATE MetadataSchema.Attribute SET MinValue = 0, MaxValue = NULL -- 根据需求调整,NULL表示取消最大值限制 WHERE LogicalName = '你的汇总字段逻辑名' AND EntityId = (SELECT EntityId FROM MetadataSchema.Entity WHERE LogicalName = '主实体逻辑名')
- 执行后重启Dynamics 365应用池与异步服务,清除服务器和浏览器缓存,确保元数据生效
方案2:PowerShell调用Organization Service修改元数据
通过官方API修改字段约束,无需直接操作SQL:
- 编写并执行以下PowerShell脚本(替换占位符为你的环境信息):
Add-Type -Path "C:\Program Files\Microsoft Dynamics 365\WebResources\bin\Microsoft.Xrm.Sdk.dll" $connectionString = "AuthType=AD;Url=http://你的D365服务器地址/XRMServices/2011/Organization.svc;Domain=域名;Username=用户名;Password=密码" $service = New-Object Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy($connectionString) # 获取目标字段元数据 $attributeRequest = New-Object Microsoft.Xrm.Sdk.Messages.RetrieveAttributeRequest $attributeRequest.EntityLogicalName = "主实体逻辑名" $attributeRequest.LogicalName = "汇总字段逻辑名" $attributeRequest.RetrieveAsIfPublished = $true $attributeResponse = $service.Execute($attributeRequest) $attribute = $attributeResponse.AttributeMetadata # 修改最小值和最大值 $attribute.MinValue = 0 # 设置为允许的最小值,如0 $attribute.MaxValue = $null # 取消最大值限制或设置具体数值 # 更新字段元数据 $updateRequest = New-Object Microsoft.Xrm.Sdk.Messages.UpdateAttributeRequest $updateRequest.Attribute = $attribute $updateRequest.EntityName = "主实体逻辑名" $updateRequest.MergeLabels = $true $service.Execute($updateRequest)
- 执行后刷新Dynamics 365界面,验证字段约束是否生效
方案3:前置插件绕过约束
若不想改动字段元数据,可编写插件在保存时临时调整值:
- 创建插件注册在主实体的
Create、Update消息前置阶段,代码示例:
using Microsoft.Xrm.Sdk; public class BypassRollupFieldConstraint : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity entity) { string rollupFieldName = "你的汇总字段逻辑名"; if (entity.Contains(rollupFieldName) && entity.GetAttributeValue<int>(rollupFieldName) == 0) { // 临时设置为符合原约束的1,保存后可在后置阶段改回0 entity[rollupFieldName] = 1; } } } }
- 将插件部署到本地Dynamics 365环境,确保保存记录时触发
注意事项
- 所有操作前必须备份数据库,避免数据丢失
- 修改元数据后需清除缓存,确保界面同步更新
- 插件方案仅绕过约束,不修改字段本身的元数据设置
内容的提问来源于stack exchange,提问作者Sefid NT
相关产品推荐
相关产品推荐

