エンティティを削除する前に、いくつかの前提条件が真であるかどうかを確認するプラグインを使用しています。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!");
}
}
}