2

MarketingList(A) を削除すると、MarketingList(A) の属性に格納されている Guid を使用して別の Marketing List(B) を起動して取得するプラグインがあります。

MarketingList(A) を選択して削除すると、MarketingList(B) が正しく削除されます。しかし、両方 (A & B) またはグリッド上のすべてのレコードを選択すると、「エラーが発生しました。選択したアクションは、1 つ以上のレコードに対して完了しませんでした」という警告が表示されます。警告の後、レコードは削除されます。

どんな助けでも大歓迎です!

プラグイン:

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();
    }

}

4

2 に答える 2

1

これを回避できるかどうかはわかりません(少なくとも現在の設計では)。

問題は、グリッドが既に削除されたものを削除しようとしていることにあると思います。

レコードを削除しようとする前に、グリッド コントロールがレコードが存在するかどうかを確認していないと思われます。私はそれを期待していません。削除するもののリストが与えられただけなので、それらがまだ存在していると想定するのが妥当なようです。

これを修正する方法はいくつかあります。

  1. ワークフローを使用してレコードを削除します。この方法では、グリッドが作業を終了した後に常に実行する必要があります。
  2. プラグインを投稿で非同期に実行します。この方法でも、グリッドが作業を終了した後に常に実行する必要があります。
  3. グリッドから削除ボタンを削除し、削除する前にレコードが存在するかどうかを確認する動作を持つカスタム リボン ボタンを追加します。

補足として、実装したプラグインがカスケード関係と同じ動作を実行することを認識していますか? リレーションシップをカスケード削除に設定した場合、コードは必要ありません。

于 2012-11-10T18:33:30.263 に答える
0

B の ID の文字列のみを A のフィールド (tph_WitnessMarketingListID) に格納していると仮定します。B が A の前に削除された可能性があるため、削除に失敗した可能性があります。プラグインをデバッグして、失敗している行を確認してください。

于 2012-11-09T12:25:57.793 に答える