使用Microsoft Graph SDK更新Schema Extension值始终为NULL问题求助
问题根源及修正方案
你遇到的问题由4个核心错误导致,对应修正方式如下:
错误点
- Schema Extension ID使用错误:创建自定义Schema Extension时,如果未使用租户已验证域名作为ID前缀,Graph会自动生成
ext<8位随机字符>_<你自定义ID>格式的完整ID,你代码中直接用自定义的data1作为字段key,和实际存储的完整ID不匹配,导致写入、读取都找不到对应字段。 - AdditionalData赋值方式错误:
usr.AdditionalData本身就是字典类型,你直接把另一个字典extensionInstance整体作为值插入,相当于多套了一层字典结构,不符合API参数要求。 - 更新用户传参冗余:直接传入查询返回的完整User对象执行更新,可能携带只读属性触发静默错误,即使返回成功也不会实际生效。
- 用户查询过滤字段错误:原代码过滤用户时写的
userPrincipalNames是错误字段名,正确字段名为userPrincipalName(单数),可能导致查询到错误用户。
修正代码
1. 创建Schema Extension后获取完整ID
// 创建SchemaExtension之后必须拿返回对象的Id,这才是实际生效的完整ID var createdExtension = await graphServiceClient.SchemaExtensions.Request().AddAsync(schemaExtension); // 后续所有操作都用这个fullExtensionId,不要用自己定义的"data1" string fullExtensionId = createdExtension.Id; // 格式和你Graph Explorer里看到的extXXXXXXXX_data1一致
如果是复用已经创建好的Schema,直接查询获取完整ID即可:
var existExtension = await graphServiceClient.SchemaExtensions["data1"].Request().GetAsync(); string fullExtensionId = existExtension.Id;
2. 修正用户扩展字段写入逻辑
var usrCollection = await graphServiceClient.Users .Request() .Filter($"userPrincipalName eq '{adelev_Mail}'") // 修正字段名 .GetAsync(); var usr = usrCollection.FirstOrDefault(); if(usr != null) { // 新建空User对象,只传需要更新的字段,避免只读属性冲突 var updateUser = new User { AdditionalData = new Dictionary<string, object>() }; // 直接插入键值对,不要套多余的字典 updateUser.AdditionalData.Add(fullExtensionId, new data1 { Prop1 = "testing" }); await graphServiceClient.Users[usr.Id] .Request() .UpdateAsync(updateUser); }
3. 修正扩展字段查询逻辑
User updatedUser = await graphServiceClient.Users[usr.Id].Request() .Select($"id, {fullExtensionId}") // 用完整ID查询 .GetAsync(); // 读取扩展值 var extensionData = updatedUser.AdditionalData[fullExtensionId] as data1; var prop1Value = extensionData?.Prop1;
内容的提问来源于stack exchange,提问作者Karthik Dhanasekaran
相关产品推荐
相关产品推荐

