4

オンサイトの Dynamics CRM 2011 インストール用のプラグインを作成しようとしています。

以下のようにプラグインを登録しました。

  • メッセージ: 作成
  • 主なエンティティ: 連絡先
  • 実施段階:手術後
  • 実行モード: 同期
  • 実行順序: 1

プラグインコードは次のとおりです。

public void Execute(IServiceProvider serviceProvider)
{
    var pluginExecContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    var orgServiceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    var orgService = orgServiceFactory.CreateOrganizationService(pluginExecContext.UserId);
    var orgServiceContext = new OrganizationServiceContext(orgService);

    var tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

    if (pluginExecContext.InputParameters.Contains("Target") &&
            pluginExecContext.InputParameters["Target"] is Entity)
    {
        var target = (Entity)pluginExecContext.InputParameters["Target"];

        if (target.LogicalName != Contact.EntityLogicalName) 
            return;

        try
        {
            var customerServicesUser = orgServiceContext.CreateQuery(SystemUser.EntityLogicalName)
                .Where(x => (string)x["fullname"] == "Customer Services").FirstOrDefault();

            if (customerServicesUser == null)
                throw new InvalidPluginExecutionException("No Customer Services user exists.");

            var sendEmail = new cdi_sendemail
                {
                    cdi_fromrecordowner = false,
                    cdi_contactid = new EntityReference(Contact.EntityLogicalName, pluginExecContext.PrimaryEntityId),
                    cdi_fromid = new EntityReference(SystemUser.EntityLogicalName, customerServicesUser.Id)
                };

            tracingService.Trace("PostContactCreate plug-in: Creating the cdi_sendemail entity.");
            orgService.Create(sendEmail);
        }
        catch (FaultException<OrganizationServiceFault> ex)
        {
            throw new InvalidPluginExecutionException("An error occurred in the PostContactCreate plug-in.", ex);
        }
        catch (Exception ex)
        {
            tracingService.Trace("PostContactCreate plug-in: {0}", ex.ToString());
            throw;
        }
    }
}

pluginregistration ツールを使用してプラグインのプロファイルを作成し、フォルトの例外をデバッグすると、次のエラーが発生します。

ID = abbc7e0a-20a0-e111-a36e-005056860004 の連絡先は存在しません。

プラグインがまだコミットされていない SQL トランザクション内で実行されているため、私はこれを理解しています。CRM SDK サンプル内の "FollowupPlugin" は、参照されるエンティティも作成しますが、非同期で登録する必要があると述べています。これは、SQL トランザクションをコミットできるようにするためにも意味があります。

私の質問は、同期プラグインで参照されるエンティティをどのように作成するのですか?

4

1 に答える 1

3

非常によく似た例の SDK の例を見ると、サンドボックスに登録する必要があると思います。

Create メッセージで、非同期モードで、このプラグインをアカウント エンティティに登録します。または、サンドボックス内のポストイベントにプラグインを登録できます。

于 2012-05-18T14:49:09.603 に答える