我需要将一些实体(帐户、潜在客户、联系人等)同步到 crm 数据库之外但在同一服务器上的数据库表。我正在寻找一种支持的方式来做到这一点。这是我尝试过的,但不起作用:
我首先在外部数据库中创建了与 dbo.account (视图)中的模式匹配的表。然后我写了post create、post update、post assign和post delete插件来创建、更新或删除外部表中的记录(使用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;
}