2016-04-21 23 views
4

下面的代码(补丁)的对象是我迄今发现使用Microsoft Graph Client Library澄清如何更新使用Microsoft.Graph客户

方案来更新对象的唯一方法:

  1. 负载的exisiting对象(组织)
  2. 修改值(securityComplianceNotificationPhones添加条目)
  3. 发送更新

代码

var client = new GraphServiceClient(...); 

var org = client.Organization["orgid"].Request().GetAsync().Result; 
var secPhones = new List<string>(org.SecurityComplianceNotificationPhones); 
secPhones.Add("12345"); 

var patchOrg = new Organization(); 
patchOrg.SecurityComplianceNotificationPhones = secPhones; 

var orgReq = new OrganizationRequest(
    client.Organization[org.Id].Request().RequestUrl, 
    client, new Option[] {}); 
orgReq.UpdateAsync(patchOrg).Wait(); 

我需要使用的,因为两件事情patchOrg例如:

  1. Graph API documentation状态

    “在请求正文中提供的值对于 应该更新的相关字段。未包含在 请求正文中的现有属性将保留其先前的值,或基于对其他属性值的更改重新计算 。为了获得最佳性能,你 不应该包括没有改变现有的值。”

  2. 如果你真的包括没有改变 (即assginedLicenses)请求失败现有值,如果这些现有值 是只读

我的问题是:?是/会不会有在Azure ActiveDirectory GraphClient更新例如像现有对象更直接的方式只是为了比较,在Azure中的Active直接相同的情况下ory图

var client = new ActiveDirectoryClient(...); 
var org = client.TenantDetails.GetByObjectId("orgid").ExecuteAsync().Result; 
org.SecurityComplianceNotificationPhones.Add("12345"); 
org.UpdateAsync().Wait(); 

回答

3

Graph客户端库模型与您链接的AAD客户端库的旧SDK模型略有不同。较旧的模型围绕试图变得更智能一些的对象传递,并推断哪些属性发生了变化,只发送这些对象。这种模式的主要缺点之一是该库在后台进行了更多的服务调用,并且在每次调用中都有更重的负载,因为ExecuteAsync()通常需要检索请求生成器链中的每个对象。较新的库确实要求开发人员对传递的数据进行更明确的推理,但也会更好地控制网络调用和有效负载。每个模型都有其折衷。

来完成你想要什么,这里的方法我会建议,而不是完全创建第二个组织对象:

var client = new GraphServiceClient(...); 

var orgRequest = client.Organization["orgid"].Request(); 
var org = orgRequest.Select("securityComplianceNotificationPhones").GetAsync().Result; 

var secPhones = new List<string>(org.SecurityComplianceNotificationPhones); 
secPhones.Add("12345"); 

org.SecurityComplianceNotificationPhones = secPhones; 

orgRequest.UpdateAsync(org).Wait();