0

CRMDynamicsプラグインに取り組んでいます。「email」という名前のカスタムエンティティにフィールドがあります。2つのエンティティレコードの電子メールアドレスが一意であることを確認したいと思います。その目的のために、私は次のコードを書きました:

public class Class1 : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        // Obtain the execution context from the service provider.
        Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
            serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

        // Get a reference to the organization service.
        IOrganizationServiceFactory factory =
        (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = factory.CreateOrganizationService(context.UserId);


        // The InputParameters collection contains all the data passed in the message request.
        if (context.InputParameters.Contains("Target") &&
            context.InputParameters["Target"] is Entity)
        {
            Entity entity = (Entity)context.InputParameters["Target"];

            //</snippetAccountNumberPlugin2>

            // Verify that the target entity represents an account.
            // If not, this plug-in was not registered correctly.
            if (context.MessageName.ToUpper() == "CREATE")
            {
                if (entity.LogicalName == "new_assignment1entity")
                {
                    try
                    {
                        QueryExpression query = new QueryExpression("new_assignment1entity");
                        query.ColumnSet.AddColumns("new_email");
                        EntityCollection result1 = service.RetrieveMultiple(query);
                        foreach (var a in result1.Entities)
                        {
                            int size = result1.Entities.Count;
                            if (a.Attributes["new_email"].ToString().Equals(entity["new_email"]))
                                throw new InvalidPluginExecutionException("Duplicate Email found!");
                        }
                    }
                    catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
                    {
                        //You can handle an exception here or pass it back to the calling method.
                        throw new InvalidPluginExecutionException("Some problem occurred while Querying Records!");
                    }
                }
            }
            else if (context.MessageName.ToUpper() == "UPDATE")
            {
                if (entity.LogicalName == "new_assignment1entity")
                {
                    try
                    {
                        QueryExpression query = new QueryExpression("new_assignment1entity");
                        query.ColumnSet.AddColumns("new_email");
                        EntityCollection result1 = service.RetrieveMultiple(query);
                        foreach (var a in result1.Entities)
                        {
                            int size = result1.Entities.Count;
                            if (a.Attributes["new_email"].ToString().Equals(entity["new_email"]))
                                throw new InvalidPluginExecutionException("Duplicate Email found!");
                        }
                    }
                    catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
                    {
                        //You can handle an exception here or pass it back to the calling method.
                        throw new InvalidPluginExecutionException("Some problem occurred while Querying Records!");
                    }
                }
            }
        }
    }
}

ユーザーが重複する電子メールアドレスで新しいエンティティレコードを作成すると、このコードは機能し、エラーメッセージを印刷するダイアログボックスを表示します。ただし、ユーザーが既存のレコード(更新および既存のレコード)を編集して電子メールアドレスを複製すると、このコードは機能せず、複製された電子メールアドレスで更新されたレコードが保存されます。
UPDATEelse部分のコンテキストメッセージが機能していないと推測しています。
私を助けてください。

4

2 に答える 2

2

残念ながら、これはひどく非効率的な方法で行われているため、これをデバッグする価値はありません。(最も可能性の高い原因は、CRMの「機能」の対象となるクエリの方法です。つまり、自分が思っているすべてのレコードをクエリしているわけではありません)。

要するに、あなたのコードは言う:

  • new_assignment1entityエンティティのALL(*)インスタンスを取得します
  • 更新で提供された値と一致する(大文字と小文字が区別される)電子メールアドレスを持つレコードが見つかるまで、各レコードを調べます
  • 最初の完全一致に遭遇したときに例外をスローします(それ以外の場合はトランザクションを続行します)

主な注意点:

  1. QueryExpressionは、CRMの最初の最大5000レコードのみを返します
  2. 属性が指定された値と一致するnew_assignment1entityレコードのみを返すようにクエリをフィルタリングする必要がありますnew_email
  3. String.Equals(string)大文字と小文字が区別されるため、重複を本当にチェックするには、各値の大文字と小文字を変換する必要があります
  4. あなたのsize変数は目的を果たしません
  5. 新規/更新されたレコードに。の値がない場合、コードは例外をスローしますnew_email。属性にアクセスする前に、属性が存在することを確認する必要があります
于 2012-11-07T17:15:31.980 に答える
0

この問題を解決しました。更新ではなく作成実行フローのみが実行されていた理由の問題は、メッセージ作成ステップのプラグインのみを登録したことです。この問題を解決するために、同じプラグインに新しいステップを追加し、次のスクリーンショットに示すように更新メッセージで登録しました。

ここに画像の説明を入力してください

そしてそれは魅力のように働いた。

これとは別に、@ GregOwensは非常に役立つポイントについて言及しました。これらは、CRM開発のベストプラクティスとして従う必要があります。

于 2012-11-14T07:33:53.263 に答える