1

エンティティを削除する前に、いくつかの前提条件が真であるかどうかを確認するプラグインを使用しています。false の場合は、 をスローしInvaludPluginExecutionExceptionます。これは非常にうまく機能しますが、私の問題は、エンティティの更新を処理する別のプラグインがあり、もちろんいくつかの条件が真であり、リンクされたエンティティを削除したことです。アカウントエンティティにはエンティティのリストがAccountGroups存在することを理解する必要があります。AccountGroup更新プラグインは、プライマリとしてフラグが立てられたエンティティが1 つしかないことに注意します。アカウントに新しいAccountGroupエンティティを追加すると、プラグインはAccountGroupプライマリとしてフラグが付けられた古いエンティティを削除し、新しいAccountGroupエンティティをプライマリとして追加します。この場合、Update Plugin は Pre Delete Plugin を起動し、削除ステップをキャンセルします。さらにInvalidExecutionExceptionを投げる。

プラグインが起動している場所を見つける方法はありますか? たとえば、更新プラグインは削除呼び出しを起動しますが、事前削除プラグインを実行する必要はありませんか? それとも他に方法はありますか?

事前削除プラグインのコード:

[OnPreDelete]
public void PreventDeletion(IServiceProvider serviceProvider){

    var pluginServiceFactory = new PluginServiceFactory(serviceProvider);
    var targetAccount = pluginServiceFactory.Context.GetTargetEntityReference();



    using (var context = new DataContext(pluginServiceFactory.OrganizationService))
    {
        var acgr = (from ac in context.im_customergroupSet
                  where ac.Id == targetAccount.Id
                  select ac).FirstOrDefault();


        if (acgr.im_Primary == true)
        {
            throw new InvalidPluginExecutionException("Primary Account Groups can not be deleted!");
        }
    }            
}
4

1 に答える 1

1

SharedVariables コレクションを使用してプラグイン間でデータを渡すことで、これを解決できる場合があります。MSDNを参照してください。これにより、Update プラグインが、削除プラグインが読み取ることができる SharedVariables にフラグを追加できるようになるはずです。その後、そこからロジックを駆動できます (たとえば、フラグが設定されている場合は、レコードの削除を停止しないでください)。 .

于 2012-10-22T15:21:11.090 に答える