在插件中,我必须通过预同步,后同步,后异步来更新插件被触发的记录。
在Pre-sync-state中,我只需要更新Context-Entity,例如mycontact.Attributes [“lastname”] =“ABC”并自动保存更改后的值。
在更新后,我不能这样做,因为它已经在数据库中(但没有提交)。我尝试使用该服务(service.update(mycontact)失败。
在更新后更新记录(同步/异步)的最佳方法是什么 - 如果可能在al ?!
更新其他记录没有问题,但更新记录插件是由/来自触发不起作用。 : - (
任何想法?
此致 尼克
答案 0 :(得分:3)
在上述情况下,同步操作将无法正常运行,因为值尚未保存在数据库中,因此选项左侧为 async-post-update 并且检查
if (context.Depth > 1){ return; } //To Avoid Multiple Trigger Of Same Update Plugin.
答案 1 :(得分: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插件相同的操作。
如果您只想更新同一记录的字段,建议使用“预同步”插件。这将减少更新操作,因为此步骤在Core操作阶段之前执行。如果要将与EntityReference(Lookup)相同的记录设置为另一条记录,则需要在Post Async插件中执行此操作。
答案 2 :(得分:1)
你可以使用一种方法来避免插件使用它运行多次。
if (localContext.PluginExecutionContext.Depth > 1) { return; }
希望这就是你的意思。
答案 3 :(得分:1)
如前所述,在调用当前记录后操作的更新时,您必须捕获context.depth属性大于1。
我强烈建议您,如果您只编辑当前记录而不需要将其他实体关联到它,那么请注册您的插件预操作。这样,您只需更改属性并让主操作将它们提交到数据库。
答案 4 :(得分:1)
在Pre: -
尝试更新上下文,因为它保存了上下文的数据: -
Entity test= (Entity)context.InputParameter["Target"];
test["name"]="ABC";
context.InputParaeter["Target"] = test;
在Post(Syn / Asyn)中: -
尝试创建新对象以更新记录,如
Entity test=new Entity("contact");
test.Id=((Entity)context.InputParameter["Target"]).Id;
test.Attributes["firstname"]="ABC";
service.Update(test);
还请检查
Context.Depth<=1;
答案 5 :(得分:0)
我的猜测是你的插件被多次触发并达到了插件的递归限制。
通常,您只希望在更改相关字段时触发插件。
此外,请确保您的更新调用仅具有需要在发送到更新方法的对象上更新的属性。大多数时候,我不会从插件上下文更新对象,但我会使用Id属性集更新新记录。这有助于防止递归方案。
如果您想要更具体的答案,则需要在问题中添加更多信息。
答案 6 :(得分:0)
您必须检索要更新的记录
Entity EntityUpdate= service.retrieve(entity,id,true);
然后更新像
这样的字段 EntityUpdate["field1"] = "abc";
然后
service.update(EntityUpdate);
答案 7 :(得分:0)
service.Update(entity)
应该在后期工作。无论如何,在更新操作期间,您无权访问实体的所有字段,而只能访问已更新的字段。 如果要修改其他字段,则需要使用检索来检索实体(始终只检索所需的字段以获得更好的性能)。 基本上问题应该是您正在读取值,或更新尚未转发到上下文的字段,因此为空。
答案 8 :(得分:-1)
您说得对,将记录保存到数据库后,您将无法通过直接修改其内容来更新上下文记录。
相反,您需要创建一个新的实体对象,然后使用新值更新它。
Entity oContact = New Entity("contact");
oContact.Id = myContact.Id;
oContact.Attributes.Add("lastname", "ABC");
organizationService.Update(oContact);