如何通过Master Data Services(MDS) WCF API获取域属性值
解决MDS WCF API域属性取值问题
我之前在做MDS WCF API集成的时候也踩过这个坑!不得不说MDS的官方文档确实不够清晰,特别是域属性这块的取值逻辑,和普通属性完全不一样。我来分享下我当时解决的方法:
核心逻辑:域属性的本质是关联实体成员
域属性其实是当前实体和另一个实体的关联,所以它的Value存储的是关联成员的Code,而不是直接显示的名称或其他属性。如果要获取关联成员的详细信息(比如名称),需要在请求中启用返回关联成员数据,再从返回结果中匹配。
步骤1:调用EntityMembersGet时启用域属性关联数据
在构建EntityMembersGetRequest的时候,一定要把ReturnDomainAttributes设为true,否则API不会返回关联的成员数据:
// 初始化请求对象 var getRequest = new EntityMembersGetRequest { MembersGetCriteria = new MembersGetCriteria { ModelId = new Identifier { Name = "你的模型名称" }, EntityId = new Identifier { Name = "你的目标实体名称" }, VersionId = new Identifier { Name = "你的版本名称" }, // 比如"VERSION_1" ReturnDomainAttributes = true, // 关键配置:必须开启才能拿到关联成员数据 // 可以加上其他筛选条件,比如指定成员Code MemberReturnCriteria = new MemberReturnCriteria { MemberCodes = new List<MemberCode> { new MemberCode { Value = "要查询的成员Code" } } } } }; // 调用API获取数据 var client = new MetadataServiceClient(); // 或者你自己初始化的WCF客户端 var getResponse = client.EntityMembersGet(getRequest);
步骤2:区分普通属性和域属性并取值
返回的EntityMembers对象里,有两个关键集合:
Members:当前实体的成员列表RelatedMembers:所有域属性关联的成员列表
遍历成员属性时,通过Attribute.DomainEntityId判断是否为域属性:
foreach (var member in getResponse.EntityMembers.Members) { Console.WriteLine($"===== 成员Code: {member.Code.Value} ====="); foreach (var attr in member.Attributes) { var attrName = attr.AttributeId.Name; if (attr.DomainEntityId != null) { // 这是域属性:Value是关联成员的Code var relatedCode = attr.Value?.ToString(); // 从RelatedMembers中匹配对应的关联成员 var relatedMember = getResponse.EntityMembers.RelatedMembers .FirstOrDefault(rm => rm.Code.Value == relatedCode && rm.EntityId.Id == attr.DomainEntityId.Id); if (relatedMember != null) { // 假设关联实体的名称属性叫"Name",可以根据实际属性名修改 var relatedName = relatedMember.Attributes .FirstOrDefault(a => a.AttributeId.Name == "Name")?.Value?.ToString(); Console.WriteLine($"{attrName}: {relatedName} (关联Code: {relatedCode})"); } else { Console.WriteLine($"{attrName}: {relatedCode} (未找到关联成员)"); } } else { // 普通属性直接取Value Console.WriteLine($"{attrName}: {attr.Value?.ToString()}"); } } }
额外说明
- 如果你的域属性是多值类型(比如一个成员关联多个其他实体成员),那么需要用
attr.Values集合来获取所有关联的Code,再逐个匹配RelatedMembers。 - 确保你有权限访问关联的实体,否则
RelatedMembers可能返回空。 - 可以通过
attr.AttributeId.Id或Name来精准定位特定属性,避免遍历所有属性。
内容的提问来源于stack exchange,提问作者RJD
相关产品推荐
相关产品推荐

