2013-02-26 65 views
2

我是Dynamics CRM Online中的新手,在更新已部署的插件時遇到問題。我使用Visual Studio 2012作爲我的IDE。我部署了一個需要修改的插件,當我通過VS重新部署它時,CRM中的修改日期是正確的,但更改不存在。這是我的代碼..如何在Dynamics CRM Online中更新已部署的插件

if (context.InputParameters.Contains("Target") 
    && context.InputParameters["Target"] is Entity) 
{ 
    Entity entity = (Entity)context.InputParameters["Target"]; 
    if (entity.LogicalName == "lead") 
    { 
    if (entity.Attributes.Contains("companyname") == true) 
    { 
     if (entity["firstname"].ToString() != "null") 
     firstName = entity["firstname"].ToString(); 
     else 
     firstName = ""; 

     if (entity["lastname"].ToString() != "null") 
     lastName = entity["lastName"].ToString(); 
     else 
     lastName = ""; 

     entity["companyName"] = "This is a test"; 
     //entity["companyname"] = firstName + " " + lastName; 
    } 
    else 
     throw new InvalidPluginExecutionException(
     "The company name can only be set by the system."); 
    } 
} 

當我創建公司名稱不是「這是一個測試」。我不確定我做錯了什麼。

感謝您的幫助!

回答

3

您檢測是否通過存在與公司名稱的字段:

if (entity.Attributes.Contains("companyname") == true) 

,但你寫的其他的,即:

entity["companyName"] = "This is a test"; 

值放在實體,而是因爲它沒有元數據中的對應元素,它沒有被存儲。將字段名稱設置爲模式名稱,即下部封裝。


其他一些事情要考慮的情況下,你會得到額外的錯誤。

  • 你需要調用服務更新方法你設置字段的值之後。
  • 該字段應該有某種前綴(例如new_something,beep_something)。
  • 這裏的駱駝套不適用(模式名是),所以去alltolowercase

什麼你得到公司名稱?你會拋出異常嗎?


此外,一些關於代碼質量的指針。我重建了邏輯以消除範圍的不必要的複雜性。我刪除了多餘的其他陳述和比較。我還建議您將流程拆分爲不同的方法,但我相信您已經涵蓋了這一點。您可能想要使用輔助方法從字段中獲取值。見in this post at my suggestion

if (!context.InputParameters.Contains("Target") || 
    context.InputParameters["Target"] is Entity) 
    return; 

Entity entity = context.InputParameters["Target"] as Entity; 
if (entity.LogicalName != "lead") 
    return; 
if (!entity.Attributes.Contains("companyname")) 
    throw new InvalidPluginExecutionException(
    "The company name can only be set by the system."); 

String firstName = String.Empty; 
if (entity.Contains("firstname")) 
    firstName = entity["firstname"] as String; 

String lastName = String.Empty; 
if (entity.Contains("lastname")) 
    lastName = entity["lastname"] as String; 

entity["companyname"] = "This is a test"; 
//entity["companyname"] = firstName + " " + lastName; 

編輯:

如果你還沒有得到所要求的行爲,請嘗試以下。 (我不確定你的專業水平如何,所以請接受我的道歉,如果你覺得我侮辱了一些非常基本的東西,你已經嘗試了數十億次。)

技術竅門。

  1. 發佈所有的自定義(我經常這樣做非常,以防萬一)。
  2. 點擊F5重新加載。
  3. 登錄/註銷。
  4. 重新啓動IIS(如果內部部署)。
  5. 取消註冊插件,看看行爲是否仍然存在。 然後重新註冊它。
  6. 檢查忘記的工作流程正在運行。

可能有一些延遲和滯後。有一次,我實際上已經插入舊版本和新版本的插件,具體取決於我是否創建了設置工作場所中的記錄。這很奇怪,但在幾個小時後自行解決。認真。 很奇怪!

編程技巧。

  1. 檢查是否還有其他插件可能已經忘記停用。
  2. 刪除所有的線索,並確保插件觸發新的創建。
  3. 將文字更改爲例如我是一個巨大的駝鹿,只是爲了確保變化能夠通過。
  4. 大幅削減了所有的代碼(或將回報開始執行。然後,通過步其向下移動一步時,怪事開始檢測。

中你已經證明什麼,這應該工作,所以要麼你沒有提到相關的東西(當然,我們讚賞你沒有發佈100000行代碼),或者它是CRM的剔除(這同樣令人討厭和困惑),所以,讓我們麻煩當你嘗試上面的技巧時會發生什麼?

至於代碼存根,是的 - 我並不爲那裏的MS努力感到自豪。嘗試在程序員的標籤C#下面發佈該代碼以進行代碼審查。準備好進行憤怒的討論。 :)

+0

感謝您的回覆。我改變了屬性名稱,因爲它是一個錯字,但沒有什麼區別。如果你看看註釋掉的語句,如果我改變了姓氏,我得到的是「null lastname」。我試圖做的改變是消除「空」(第一個名字是空的)。我希望這個實例可以由創建主角的人來更新。 – Gary 2013-02-26 22:43:02

+0

@加里你很快就會成功。檢查我的編輯。我的壞 - 我實際上也重複了你的錯字。 :) – 2013-02-26 22:48:02

+0

你消除了許多Visual Studio作爲存根創建的東西,很高興看到另一種方式來做到這一點,但它並沒有改變任何東西。我仍然以「null lastname」而不是「這是一個測試」 – Gary 2013-02-26 23:52:09

相關問題