Plugins CRM 2011:如何在创建插件中更新记录?

Plugins CRM 2011:如何在创建插件中更新记录?,plugins,dynamics-crm,crm,dynamics-crm-2011,Plugins,Dynamics Crm,Crm,Dynamics Crm 2011,我在如何用一些额外的数据更新刚刚创建的记录方面遇到了严重的问题 案例:我有一个短信活动。在上创建sms记录。一个插件触发以实际发送短信。第三方sms提供商负责发送并返回状态字符串。根据这些字符串,必须更新sms的状态 以下是我的一些代码: public void Execute(IServiceProvider服务提供者) { IPluginExecutionContext上下文=(IPluginExecutionContext) GetService(typeof(IPluginExecuti

我在如何用一些额外的数据更新刚刚创建的记录方面遇到了严重的问题

案例:我有一个短信活动。在上创建sms记录。一个插件触发以实际发送短信。第三方sms提供商负责发送并返回状态字符串。根据这些字符串,必须更新sms的状态

以下是我的一些代码:

public void Execute(IServiceProvider服务提供者)
{
IPluginExecutionContext上下文=(IPluginExecutionContext)
GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory服务工厂=
(IOOrganizationServiceFactory)serviceProvider.GetService(
类型(IOrganizationServiceFactory));
IOrganizationService服务=
serviceFactory.CreateOrganizationService(context.UserId);
aContext orgContext=新的aContext(服务);
实体sms=(实体)上下文.InputParameters[“目标”];
///逻辑就在这里
sms.StatusCode=新选项SetValue(StatusCode);//StatusCode为整数
服务更新(sms);
}
每次我执行插件时,插件都会出错。有人能帮我解释一下我做错了什么吗


谢谢

由于插件是同步执行的,如果您使用预操作执行阶段,那么更新实体应该很容易

在这种情况下,您可以这样做:

Entity sms = (Entity)context.InputParameters["Target"]

// additional code to retrieve status

if(sms.Attributes.Contains("statuscode"))
    sms.Attributes["statuscode"] = new OptionSetValue(statuscode);
else
    sms.Attributes.add("statuscode", new OptionSetValue(statuscode));

这样,您只需从Attributes dictionnary添加或更新一个键,它将被保存,就像值直接来自表单一样

你想让你的插件同步还是异步执行?你的短信是什么?这是早期绑定上下文吗?你用它吗?嗨。它是同步的。文本确实是我早期的背景。我有时在某些情况下使用它。我知道我可以将其用于UpdateObject和SaveChanges方法,但在我的情况下,这两种方法都不起作用。我知道如果您尝试更新从上下文中使用Linq检索的记录,会出现问题。我应该使用什么方法来更新?我现在使用service.update(sms)时收到“Id=8d6d41ae-0d11-e111-b730-14feb5d96ef6的sms不存在”;哦,这真是太好了!如果你这样做,我不需要任何更新方法^^谢谢你的回答!您不必使用任何更新方法。在预操作中,数据库中尚未保存任何内容。但是在你的插件被执行之后,你在属性字典中能找到的所有东西都会被自动保存。所以,如果你只是在里面添加一些东西,它会把它看作任何其他属性,并以同样的方式保存它。嗨,我有相同的情况,但它没有运行在2016的预操作。我得到以下错误。在CreateStage20插件中不允许更改状态属性。