C# 联想法

C# 联想法,c#,plugins,dynamics-crm-2011,C#,Plugins,Dynamics Crm 2011,我正在尝试将实体的相关记录与新创建的记录相关联。pluggin在创建和预操作时触发 尝试将集合与新实体关联时发生错误:“Id为ad630ba6-684e-e111-92e3-00155d151905的new_ligneContrat不存在” 这是我的密码: public void Execute(IServiceProvider serviceProvider) { // Instanciation des services IP

我正在尝试将实体的相关记录与新创建的记录相关联。pluggin在创建和预操作时触发

尝试将集合与新实体关联时发生错误:“Id为ad630ba6-684e-e111-92e3-00155d151905的new_ligneContrat不存在”

这是我的密码:

public void Execute(IServiceProvider serviceProvider)
        {
            // Instanciation des services

            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(null);


            Entity target = (Entity)context.InputParameters["Target"];
            EntityReference contrats = (EntityReference)target.Attributes["new_contratsid"];

            FetchExpression fetch = new FetchExpression(@"
                    <fetch distinct='false' mapping='logical'>
                      <entity name='" + context.PrimaryEntityName + "'><link-entity name='new_contrats' alias='nombreligne' from='new_contratsid' to='new_contratsid'><filter type='and'><condition attribute='new_contratsid' value='" + contrats.Id + "' operator='eq'></condition></filter></link-entity></entity></fetch>");

            EntityCollection lines = service.RetrieveMultiple(fetch);

                  // Vérification qu'il y a au moins une ligne de contrat associée
            if (lines.Entities.Any())
            {

                var first = lines.Entities.Last();

                if (first.GetAttributeValue<OptionSetValue>("statecode").Value == 1)
                {
                    FetchExpression query = new FetchExpression(@"
                        <fetch distinct='false' mapping='logical'>
                        <entity name='incident'><filter type='and'><condition attribute='new_lignecontrat' value='"+first.Id+"' operator='eq'/></filter></entity></fetch>");

                    EntityCollection incident = service.RetrieveMultiple(query);

                    if (incident.Entities.Any())
                    {


                        foreach (var e in incident.Entities)
                        {
                           e.Attributes["new_lignecontrat"] = new EntityReference (target.LogicalName, target.Id);
                        }


                 }
              }
           }   
public void Execute(IServiceProvider服务提供者)
{
//服务实例
IPluginExecutionContext上下文=(IPluginExecutionContext)serviceProvider.GetService(类型为(IPluginExecutionContext));
IOOrganizationServiceFactory工厂=(IOOrganizationServiceFactory)服务提供者.GetService(类型(IOOrganizationServiceFactory));
IOOrganizationService=factory.CreateOrganizationService(空);
实体目标=(实体)上下文。输入参数[“目标”];
EntityReference contrats=(EntityReference)target.Attributes[“new_contratsid”];
FetchExpression fetch=新的FetchExpression(@)
");
EntityCollection行=service.RetrieveMultiple(提取);
//Vérification qu'il y a au moins une ligne de contract associée e
if(lines.Entities.Any())
{
var first=lines.Entities.Last();
if(first.GetAttributeValue(“statecode”).Value==1)
{
FetchExpression查询=新的FetchExpression(@)
");
EntityCollection事件=service.RetrieveMultiple(查询);
if(incident.Entities.Any())
{
foreach(事件实体中的var e)
{
e、 属性[“new_LigneContat”]=新的EntityReference(target.LogicalName,target.Id);
}
}
}
}   
怎么了

提前谢谢


编辑1:确定似乎合乎逻辑,因为记录还不存在>要回答您的原始问题及其编辑,是的,当核心数据库操作尚未完成时,您不能将记录与另一个记录关联

:在管道中暂存要在主程序之前执行的插件 系统操作。执行在此阶段注册的插件 在数据库事务中

因此,要处理关联,您可以在一个或多个项目中将阶段更改为后期操作,或者让一个
IPlugin
类处理前期操作阶段,另一个处理后期操作阶段

要回答编辑,查找字段属于该类。(看起来您使用的是1:N关系?)

要回答第二次编辑,我看不到您的代码片段中有任何地方将新的
EntityReference
分配给目标
实体
。此外,您不必在操作前阶段向服务发出
更新
请求,因为尚未执行核心数据库操作。您只需设置
实体的属性
等于您选择的值,此更改将转入数据库

if(entity.Attributes.ContainsKey(“new_lignecontrat”))
{
entity.Attributes[“new_lignecontrat”]=您的EntityReference;
}
else//插件操作中不包括属性
{
Add(“new_lignecontrat”,yourentyreference);
}

微软在SDK:\SDK\samplecode\cs\plug-ins\accountnumberplugin.cs中演示了这一概念。谢谢你的教程回答Peter!在后期操作中触发插件不是问题。我确实在处理1:N关系。实际上,我需要的是,当一个新的“new\u LigneContract”创建时,将更新与事件实体中的前一个相关的查找字段。简单的e.Attributes.getValue(“new_lignecontrat”)=新的EntityReference(target.logicalName,target.Id)也会更新;做这项工作?@Mademoisellenore:没错。对于N:N关系,你必须使用
关联
方法,但是对于1:N关系,你还可以奢侈地将
实体引用
直接分配给实体,这样会很好。再次感谢Peter,仍然没有结果。我已经编辑了整个代码。@MademoiSelllenore:我认为查看那里的代码并发现问题可能超出了这个问题的范围(尽管我有一些想法,例如,
e.Attributes[“new\u lignecontrat”]
实例化了吗?)。我只能添加两个建议:尝试,并尝试使用而不是后期绑定类,这将为您处理任何属性实例化。@Mademoisellenore:有些延迟!但很高兴它现在可以工作了。:)