2

在插件中,我必须更新插件在同步前、同步后、异步后触发的记录。

在同步前状态下,我只需要更新上下文实体,例如 mycontact.Attributes["lastname"] = "ABC" 并且更改的值会自动保存。

在更新后,我不能这样做,因为它已经在数据库中(但未提交)。我尝试使用该服务 (service.update(mycontact) 失败。

在更新后(同步/异步)中更新记录的最佳方法是什么 - 如果可能的话?

更新其他记录没问题,但更新插件由/从触发的记录不起作用。:-(

有任何想法吗?

问候,尼克

4

9 回答 9

3

在上述情况下,同步操作将不起作用,因为值尚未保存在数据库中,因此左侧的选项是async-post-update并检查

if (context.Depth > 1){ return; } //To Avoid Multiple Trigger Of Same Update Plugin. 
于 2013-09-04T07:13:15.543 回答
3

您可以在 Pre Sync、Post Sync 插件或 Post Async 插件中更新记录。

要更新 Pre Sync 插件中的记录,您只需在 Context Entity 中添加字段值,如下所示:

Entity e = context.InputParameters["Target"] as Entity;
e["attribute_name"] = somevalue;

要更新 Post Sync 插件中的记录,您需要在上下文实体中添加字段值并调用 IOrganizationService 的 Update 方法,如下所示:

Entity e = context.InputParameters["Target"] as Entity;
e["attribute_name"] = somevalue;
service.Update(e);

要更新 Post Async 插件中的记录,您需要执行与 Post Sync 插件相同的操作。

如果您只想更新同一记录的字段,建议使用“Pre Sync”插件。这将减少更新操作,因为此步骤在核心操作阶段之前执行。

如果要将与 EntityReference (Lookup) 相同的记录设置为另一条记录,则需要在 Post Async 插件中执行此操作。

于 2014-04-09T06:26:39.430 回答
1

您可以使用一种方法来避免插件多次运行。

if (localContext.PluginExecutionContext.Depth > 1) { return; }

希望这就是你的意思。

于 2013-07-16T12:35:00.893 回答
1

在前:-

尝试在保存上下文数据时更新上下文:-

Entity test= (Entity)context.InputParameter["Target"];
test["name"]="ABC";
context.InputParaeter["Target"] = test;

后期(同步/异步):-

尝试创建一个新对象来更新记录

Entity test=new Entity("contact");
test.Id=((Entity)context.InputParameter["Target"]).Id;
test.Attributes["firstname"]="ABC";
service.Update(test);

也请检查

Context.Depth<=1;
于 2014-05-01T09:31:11.530 回答
1

正如其他人之前所说,在对当前记录发布操作调用更新时,您将不得不捕获大于 1 的 context.depth 属性。

我强烈建议您,如果您只编辑当前记录并且不需要将其他实体关联到它,那么请注册您的插件预操作。这样,您只需更改属性并让主要操作将它们提交到数据库。

于 2013-11-30T00:30:33.510 回答
0

您必须检索要更新的记录

Entity EntityUpdate=  service.retrieve(entity,id,true);

然后更新字段

  EntityUpdate["field1"] = "abc";

然后

 service.update(EntityUpdate);
于 2014-01-28T10:20:12.900 回答
0

我的猜测是您的插件被多次触发并达到了插件的递归限制。

通常,您只想在更改相关字段时触发插件。

此外,请确保您的更新调用仅具有需要在您发送到更新方法的对象上更新的属性。大多数时候,我不会从插件上下文更新对象,但我会使用 Id 属性集更新一条新记录。这有助于防止递归场景。

如果您想要更具体的答案,您将需要向您的问题添加更多信息。

于 2013-05-03T17:29:46.490 回答
0

service.Update(entity) 

应该在后期工作。无论如何,在更新操作期间,您无法访问实体的所有字段,而只能访问已更新的字段。如果要修改其他字段,则需要使用检索来检索实体(始终只检索您需要的字段以获得更好的性能)。本质上,问题应该是您正在读取一个值,或更新一个尚未转发到上下文并因此为空的字段。

于 2014-02-28T18:58:57.310 回答
-1

没错,记录保存到数据库后,您将无法通过直接修改其内容来更新上下文记录。

相反,您需要创建一个新实体对象,然后使用新值对其进行更新。

Entity oContact = New Entity("contact");
oContact.Id = myContact.Id;
oContact.Attributes.Add("lastname", "ABC");
organizationService.Update(oContact);
于 2013-12-15T17:37:14.893 回答