Dynamics crm 2011 CRM以编程方式创建CustomerAddress

Dynamics crm 2011 CRM以编程方式创建CustomerAddress,dynamics-crm-2011,custom-activity,Dynamics Crm 2011,Custom Activity,我正在尝试进行一项活动,将地址从潜在客户迁移到联系人。我们在CRM部署中不使用默认地址1和地址2(不是我的决定),因此,尽管资格鉴定过程会将潜在客户中输入的地址复制到联系人,但会使用地址1字段。我正在使用下面的代码,一切似乎都正常(注册时没有错误,运行使用此活动的工作流时没有错误)。只有一个问题。。。什么也没发生。虽然没有错误,但不会创建地址。我是以CRM管理员的身份运行的,所以这不应该是权限问题,但是即使是权限问题,也不应该生成安全异常吗?你知道为什么这不起作用吗 公共类MigrateLead

我正在尝试进行一项活动,将地址从潜在客户迁移到联系人。我们在CRM部署中不使用默认地址1和地址2(不是我的决定),因此,尽管资格鉴定过程会将潜在客户中输入的地址复制到联系人,但会使用地址1字段。我正在使用下面的代码,一切似乎都正常(注册时没有错误,运行使用此活动的工作流时没有错误)。只有一个问题。。。什么也没发生。虽然没有错误,但不会创建地址。我是以CRM管理员的身份运行的,所以这不应该是权限问题,但是即使是权限问题,也不应该生成安全异常吗?你知道为什么这不起作用吗

公共类MigrateLeadAddressToContactActivity:CodeActivity
{
[输入(“联系人输入”)]
[参考目标(“联系”)]
接触{get;set;}中的公共不一致
受保护的覆盖无效执行(CodeActivityContext executionContext)
{
//获取跟踪服务
var tracingService=executionContext.GetExtension();
if(InContact==null)
{
const string erromessage=“未为地址迁移活动设置联系人”;
tracingService.Trace(错误消息);
抛出新的InvalidOperationException(errorMessage);
}
//获取上下文服务
var context=executionContext.GetExtension();
var serviceFactory=executionContext.GetExtension();
//使用上下文服务创建CrmService的实例
var service=serviceFactory.CreateOrganizationService(context.UserId);
//检索联系人id
var contactId=this.InContact.Get(executionContext).Id;
//如果有线索的话,就抓住它
var query=newquerybyattribute
{
ColumnSet=新的ColumnSet(
新[]
{
“地址1_行1”,
“地址1_行2”,
“地址1_第3行”,
“地址1_市”,
“地址1_州或省”,
“地址1\u邮政编码”,
“地址1_国家”,
}
),
EntityName=“lead”
};
//查询将检索其关联联系人具有所需ContactId的所有潜在客户
query.AddAttributeValue(“customerid”,contactId);
//执行检索。
var results=service.RetrieveMultiple(查询);
var theLead=results.Entities.FirstOrDefault();
if(null==开头)
{
tracingService.Trace(“活动正在退出……联系人并非来自潜在客户”);
返回;
}
var newAddress=新实体(“customeraddress”);
newAddress.Attributes[“name”]=“business”;
属性[“objecttypecode”]=“联系人”;
newAddress.Attributes[“addresstypecode”]=200000;
newAddress.Attributes[“parentid”]=新的CrmEntityReference(“contact”,contactId);
newAddress.Attributes[“line1”]=头.Attributes[“address1_line1”];
newAddress.Attributes[“line2”]=头.Attributes[“address1_line2”];
newAddress.Attributes[“line3”]=头.Attributes[“address1_line3”];
newAddress.Attributes[“city”]=lead.Attributes[“address1_city”];
newAddress.Attributes[“stateorprovince”]=头.Attributes[“address1_stateorprovince”];
newAddress.Attributes[“postalcode”]=头.Attributes[“address1\u postalcode”];
newAddress.Attributes[“country”]=lead.Attributes[“address1_country”];
创建(新地址);
tracingService.Trace(“地址从联系人迁移到潜在客户”);
}

我觉得一切正常。如果找不到线索,我会尝试抛出异常,只是为了验证您的查询是否正常工作。如果您没有收到异常,请验证您在创建客户地址时没有任何可能导致其无法创建的插件。

假设确实没有异常抛出n、 这段代码唯一的另一个出口就是这里

if (null == theLead)
{
    tracingService.Trace("Activity exiting... Contact not sourced from Lead.");
    return;
}
因此,可以公平地假设
在这一点上,lead
是空的,工作流将优雅地结束


要测试这一点,请抛出异常。假设异常为throwm,您可以调查它为null的原因。可能是您筛选的值无效或不是您期望的值-或者字段为空。

尝试跟踪服务返回的GUID。创建并查看其中包含的内容

比如:

Guid addressId = service.Create(newAddress);
tracingService.Trace(string.format("Address ID Result: {0}", addressId));

您似乎试图直接创建一个地址记录,默认情况下绕过已经为联系人记录创建的两个地址记录(它总是创建这两个记录,无论您是否使用它们,以及是否希望它们的“影子”字段在联系人表单中可见)。 你说什么都没发生-这是通过查看SQL表或联系人记录中的“更多地址”链接来验证的吗

在创建过程中,您似乎忽略了一件事,那就是指定地址号(理想情况下,首先在与联系人关联的所有地址中找到最大的地址号,然后递增1)。在所有情况下,地址号都必须至少为3

如果查看与地址实体关联的视图定义,您将看到它显式过滤,以包括地址编号>2的地址,从而提供1和2是联系人和“更多”的“一部分”的错觉是单独的记录,而实际上所有地址(包括1和2)都是地址实体表中的行

所以
newAddress.Attributes["addresstypecode"] = 200000; 
newAddress.Attributes["addresstypecode"] = new OptionSetValue(200000);