【发布时间】:2016-12-09 14:01:00
【问题描述】:
我有这段代码在记录创建的实时工作流中运行。它基本上确定它在哪个实体上运行,尝试获取“相关字段”,该字段可以从实体更改为另一个,然后查看相关记录是否为帐户,如果是,则更新帐户的一些属性。
public override void ExecuteWorkflowLogic(XrmObjects xrmObjects)
{
using (XrmServiceContext ctx = new XrmServiceContext(xrmObjects.Service))
{
var target = xrmObjects.WorkflowContext.InputParameters["Target"] as Entity;
Xrm.Account account = null;
var regardingFieldName = string.Empty;
var logicalName = string.Empty;
var primaryKeyName = string.Empty;
switch (target.LogicalName)
{
case Xrm.Task.EntityLogicalName:
case Xrm.Email.EntityLogicalName:
case Xrm.PhoneCall.EntityLogicalName:
case Xrm.Letter.EntityLogicalName:
case Xrm.Appointment.EntityLogicalName:
case Xrm.Fax.EntityLogicalName:
regardingFieldName = "regardingobjectid";
logicalName = Xrm.ActivityPointer.EntityLogicalName;
primaryKeyName = "activityid";
break;
case Xrm.Annotation.EntityLogicalName:
logicalName = Xrm.Annotation.EntityLogicalName;
regardingFieldName = "objectid";
primaryKeyName = "annotationid";
break;
case Xrm.Opportunity.EntityLogicalName:
regardingFieldName = "customerid";
logicalName = Xrm.Opportunity.EntityLogicalName;
primaryKeyName = "opportunityid";
break;
case Xrm.Post.EntityLogicalName:
regardingFieldName = "regardingobjectid";
logicalName = Xrm.Post.EntityLogicalName;
primaryKeyName = "postid";
break;
}
var activity = (from a in ctx.CreateQuery(logicalName)
where a[regardingFieldName] != null && (Guid)a[primaryKeyName] == target.Id
select a).FirstOrDefault();
var ec = (EntityReference)activity[regardingFieldName];
if (ec == null)
return;
//if regarding isn't an account...
if (ec.LogicalName != Xrm.Account.EntityLogicalName)
return;
account = ctx.AccountSet.SingleOrDefault(x => x.Id == ec.Id);
if (account == null)
return;
account.new_last_activity_created_by = (EntityReference)target["createdby"];
account.new_last_activity_date = (DateTime)target["createdon"];
account.new_last_activity_type = GetActivityType(target); //returns an optionset based on entity logical name....
account.new_last_activity_entity_logicalname = target.LogicalName;
if (!ctx.IsAttached(account))
ctx.Attach(account);
ctx.UpdateObject(account);
ctx.SaveChanges();
}
}
我希望它在实时工作流中运行,因为更改将是即时的,而且因为创建上述实体的用户可能无权更新帐户,所以实时工作流允许我以另一个有权这样做的用户(工作流程所有者)的身份进行更新。
问题是当它用于活动实体(switch 语句中的第一个大块)时,记录看起来还没有提交到数据库,我无法获取它并进一步查看它( activity 最终为空)
如果我在 ActivityPointerBase 或 TaskBase、EmailBase 等中查找 target 的 GUID。在执行此工作流期间,我在任何地方都看不到它(我假设在创建记录之后发生这种情况)
如果我在异步工作流中运行它,它适用于所有实体。
在实时模式下,它仅适用于机会、帖子和注释。我正在测试中从社交源菜单创建活动。
上面的代码在扩展BaseWorkflowStep的类的方法中运行:
public abstract class BaseWorkflowStep : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
var xrmObjects = new XrmObjects();
var serviceFactory = context.GetExtension<IOrganizationServiceFactory>();
xrmObjects.CodeActivityContext = context;
xrmObjects.TracingService = context.GetExtension<ITracingService>();
xrmObjects.WorkflowContext = context.GetExtension<IWorkflowContext>();
xrmObjects.Service = serviceFactory.CreateOrganizationService(xrmObjects.WorkflowContext.UserId);
ExecuteWorkflowLogic(xrmObjects);
}
public virtual void ExecuteWorkflowLogic(XrmObjects xrmObjects)
{
throw new NotImplementedException();
}
}
这里发生了什么?
【问题讨论】:
-
如何创建或获取
xrmObjects.Service实例? -
@HenkvanBoeijen 我编辑了我的问题。
-
不相关,但您可以将
ExecuteWorkflowLogic设为abstract方法,而不是默认实现引发异常的virtual方法。 -
您是否尝试过将大量活动分解为每个活动的不同类型并分别查询它们?是的,我知道你应该能够针对 ActivityPointer 为所有这些创建一个查询,但是先让代码工作,然后让它变得漂亮。
标签: c# .net dynamics-crm dynamics-crm-2016