2

一部のエンティティ (アカウント、リード、連絡先など) を、crm データベースの外部にある同じサーバー上のデータベース テーブルに同期する必要があります。これを行うためのサポートされている方法を探しています。これが私が試したことですが、うまくいきません:

最初に、dbo.account (ビュー) のスキーマに一致するテーブルを外部データベースに作成しました。次に、(ADO.Net を使用して) 外部テーブルのレコードを作成、更新、または削除するために、作成後、更新後、割り当て後、削除後のプラグインを作成しました。プラグインを最小限の変更で任意のエンティティに登録できるように、最も一般的な方法でプラグインを作成しました (フィールド名をハードコーディングしないことにより)。このようにして、私が遭遇している問題は、他のテーブルへの外部キーであるフィールドにあります。例えば。dbo.account には、PrimaryContactId と PrimaryContactIdName、PreferredSystemUserId と PreferredSystemUserIdName、ParentAccountId と ParentAccountIdName などのフィールドがあります。プラグインの入力パラメーターでは、更新時に xxxxId フィールドを使用できますが、「xxxxIdName」フィールドは使用できません。

プラグイン ソリューションを機能させるソリューションはありますか? 同期テーブルを持つためのより良いサポートされている方法はありますか? 前もって感謝します、

PS: 1. データ同期はリアルタイムである必要があります

PS: 2.更新を行うクエリを取得する関数は次のとおりです。

private static string PrepareUpdateQuery(ITracingService tracingService, IEnumerable<KeyValuePair<string, object>> attributeCollection, string entityName, string entityIdName)
    {

        var query = "Update MainDb.MSCRM." + entityName + " set ";
        foreach (KeyValuePair<string, object> keyValuePair in attributeCollection)
        {
            tracingService.Trace("Key: {0}", keyValuePair.Key);
            if (keyValuePair.Key != entityIdName && keyValuePair.Key != "modifiedonbehalfby")
            {
                query = query + keyValuePair.Key + " = ";
                if (keyValuePair.Value == null)
                    query = query + "null, ";
                else
                {
                    var typeOfValue = keyValuePair.Value.GetType().Name;
                    tracingService.Trace("typeOfValue: {0}", typeOfValue);
                    switch (typeOfValue)
                    {
                        case "EntityReference":
                            query = query + "'" + ((EntityReference)keyValuePair.Value).Id + "', ";
                            break;
                        case "OptionSetValue":
                            query = query + ((OptionSetValue)keyValuePair.Value).Value + ", ";
                            break;
                        case "BooleanManagedProperty":
                            query = query + (((BooleanManagedProperty)keyValuePair.Value).Value ? "1" : "0") + ", ";
                            break;
                        default:
                            query = query + "'" + keyValuePair.Value + "', ";
                            break;
                    }
                }
            }
        }
        return query;
    }
4

4 に答える 4

3

現在実行中のプラグインの属性であるエンティティの名前だけを求めている場合、EntityReferenceオブジェクトにはその名前を含むNameプロパティがあります。そうでない場合は、IDと論理名を使用してCRMにクエリを実行し、参照されているエンティティで探している値を取得できます。

編集1

データを移動するだけの場合、なぜ参照名を設定する必要があるのでしょうか。これらの名前をデータベーステーブルから削除し、対応するエンティティの名前を検索するビューを作成しました。それがCRMが行っていることです。また、他のデータベースをより正規化することもできます。IE。別のエンティティによって参照されているエンティティの名前を更新する場合は、それらの名前をすべて検索して更新する必要があります...

于 2013-03-14T17:57:52.420 に答える
1

xxxIdName フィールドは実際にはビューのヘルパーにすぎません。何を含める必要があるかを簡単に把握できます。

たとえば、「ボブ・ボブソン」という主要連絡先を持つ「会社」というアカウントがあるとします。アカウント エンティティを処理する場合、primarycontactId は GUID になり、primarycontactIdName は「bob bobson」になり、accountIdName は「some company」になります。

プラグインでこれを行う最も簡単な方法は、関連するエンティティを検索し、そこから値を取得することです。90% の場合、それは単なる名前フィールドです。

ただし、CRM スキーマを正しく使用している場合は、必要なフィールドのみをコピーして、同期テーブルに独自のスキーマを使用する方がよい場合もあります。

更新:コードを見たところ、クエリに含まれる値を上書きしていて、ベースクエリに戻していないため、foreach の 2 回目のパスで奇妙な結果/エラーが発生します。

于 2013-03-14T18:14:19.113 に答える
1

関連するエンティティ名をプライマリ エンティティ テーブルに入れることに固執している場合は、次のようにいつでも取得できます。

var entityEntityRef = (EntityReference)keyValuePair.Value;
var relatedEntity = service.Retrieve(entityRef.LogicalName, entityRef.Id, new ColumnSet(true));

使用可能なすべての属性として relatedEntity が追加されました。ほとんどの場合、名前フィールドを探しますが、完全な名前フィールドを使用する連絡先など、一部のエンティティは異なります。

于 2013-03-14T18:51:14.713 に答える
0

実際、すべてのエンティティに単一のプラグインを登録できます(もちろん、メッセージを発信しているプラ​​グインが処理されたプラグインのリストに含まれていることを確認してください)。

IEnumerable<String> supportees = new String[]{ "account", "contact" };
if(!supportees.Any(element
  => element == targetLogicalName))
    return;

リンクされたエンティティに関しては、3つの選択肢があります。

  1. それらをスキップしてください。完全なデータ同期ではありませんが、実装は簡単です。
  2. GUIDのみを保存します。データ同期はインスタンス全体で行われます-制限はありますが、適度に簡単です。
  3. リンクされたすべてのデータを取得します。完全な情報ですが、開発する再帰的なPIAです。
于 2013-03-14T22:34:56.480 に答える