一部のエンティティ (アカウント、リード、連絡先など) を、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;
}