2012-11-09 74 views
2

當我刪除MarketingList(A)時,我有一個插件使用存儲在屬性中的Guid觸發並檢索另一個Marketing List(B) MarketingList(A)。CRM 2011插件(消息:刪除,預驗證)多刪除警告

如果我選擇MarketingList(A)並將其刪除,則會正確刪除MarketingList(B)。但是,當我同時選擇(A & B)或網格上的所有記錄時,我有一個警告: 「發生了錯誤。所選操作未完成一個或多個記錄」。 警告後,記錄被刪除。

任何幫助表示讚賞!

插件:

Message: **Delete**<br> 
PrimaryEntity: **list**<br> 
Stage of Execution: **Pre-Validation**. 

代碼:

if (context.MessageName == "Delete") 
{ 
    using (var crm = new XrmServiceContext(service)) 
    { 
     List listToDelete = crm.ListSet.Where(p => p.Id == context.PrimaryEntityId).SingleOrDefault(); 
     List retrievedList = crm.ListSet.Where(p => p.Id == new Guid(listToDelete.tph_WitnessMarketingListID)).SingleOrDefault(); 
     if (retrievedList == null) return; 
     crm.DeleteObject(retrievedList); 
     crm.SaveChanges(); 
    } 

}

回答

0

假設你只保存B的ID的字符串A.它可能的領域(tph_WitnessMarketingListID)有可能B在A之前被刪除,因此刪除可能失敗。嘗試調試您的插件以查看其失敗的行。

+0

感謝您的回覆,我調試過,沒有例外,記錄在警告後被刪除。我同意你的觀點,我認爲這是網格在試圖刪除已刪除內容時的行爲。其他建議? – user944543

1

我不確定你是否能夠避免這種情況(至少在你目前的設計中)。

我相信你是正確的問題是網格試圖刪除已被刪除的東西。

我懷疑網格控件在試圖刪除它之前沒有檢查記錄是否存在。我不期望它;剛剛給出了要刪除的東西清單,假設它們仍然存在似乎是合理的。

我可以看到幾種方法來解決這個問題。

  1. 使用工作流刪除記錄,這種方式應該始終在網格完成工作後運行。
  2. 讓你的插件在帖子上異步運行,這種方式應該總是在網格完成工作後運行。
  3. 從網格中刪除刪除按鈕,並添加一個具有行爲的自定義功能區按鈕,以在刪除之前檢查記錄是否存在。

作爲一個方面說明,你知道你已經實現的插件將執行與級聯關係相同的行爲嗎?如果您將關係設置爲級聯刪除,則不需要任何代碼。

+0

謝謝詹姆斯,我想我會和您在帖子中提到的Cascades Deletes選項一起使用。 – user944543

+0

級聯刪除可能會遇到同樣的問題。我只是指出你正在實現已經存在的邏輯。 –

+0

好的,我明白了你的意思,謝謝! – user944543