2

我是CRM開發新手。 我有一個自定義實體「客戶」。該實體有一個名爲「defaultcustomer」的字段,可以是TRUE或FALSE。我正在開發一個插件,我需要爲所有「客戶」設置「defaultcustomer」爲FALSE。我這樣做如下:CRM 2011 KeyNotFoundException異常

事實:

我已經註冊爲實體「客戶」本身的插件。所以當實體「客戶」更新時,插件會觸發。

private void MakeAllNonDefault() 
{ 

    try 
    { 
     QueryExpression query = new QueryExpression("customer"); 
     query.ColumnSet = new ColumnSet("defaultcustomer"); 

     EntityCollection retrieved = service.RetrieveMultiple(query); 

     foreach (Entity myCustomer in retrieved.Entities) 
     { 

      myCustomer["defaultcustomer"] = false; 
      service.Update(myCustomer); 
     } 

    } 
    catch (Exception ex) 
    { 
     throw new InvalidPluginExecutionException("An error occurred in MakeAllNonDefault(): " + ex.ToString()); 
    } 
} 

ERROR: 它輕視這一行錯誤:

myCustomer["defaultcustomer"] = false; 

System.Collections.Generic.KeyNotFoundException: 
The given key was not present in the dictionary. 
+2

如果您使用早期綁定並將您的返回實體投射到您的客戶實體的實例,則此類錯誤消失。 – 2012-03-28 19:52:40

回答

7

的錯誤意味着特定字段不存在屬性的集合英寸在CRM中,只包含已設置或更新的屬性。

嘗試類似:

foreach (Entity myCustomer in retrieved.Entities) 
{ 
    if (myCustomer.Attributes.ContainsKey("defaultcustomer")) 
    { 
     myCustomer["defaultcustomer"] = false; 
    } 
    else 
    { 
     myCustomer.Attributes.Add("defaultcustomer", false); 
    } 
    service.Update(myCustomer); 
} 
+1

即使他在新的QueryExpression的'ColumnSet'中顯式地包含該屬性,這是可能的嗎? – 2012-03-28 19:55:43

+0

它不適合我。 – 2012-03-29 02:13:06

+0

你會得到什麼錯誤/其他信息? – glosrob 2012-03-29 06:02:26

0

發表@glosrob的解決方案似乎罰款。你還在收到「給定的密鑰沒有出現在字典中」?

嘗試使用ITracingService獲取有關插件執行流程的更多信息。

1

你仔細檢查過這個字段是否真的叫做defaultcustomer?

如果它是一個自定義實體,那麼它可能是字段以前綴開頭,例如new_defaultcustomer。確保您使用的是該字段的名稱,而不是顯示名稱。

+0

字段名稱是可以的。 – 2012-03-29 11:09:13

+0

其實這是一個很好的觀點。如果它是一個自定義實體,據我所知,所有字段(除了默認創建的,創建的等)都會有一個前綴。 – glosrob 2012-03-29 19:00:24

0

雖然更新所有Crm字段都是False,但請接受您更新字段的內容。爲此,您可以使用插件中的前/後圖像。你會發現crm字段鍵並更新你所需要的。