gpt4 book ai didi

c# - 关联方法

转载 作者:行者123 更新时间:2023-11-30 22:31:39 29 4
gpt4 key购买 nike

我正在尝试将一个实体的相关记录关联到一个新创建的记录。插件在创建和预操作时触发。

尝试将集合关联到新实体时发生错误:“new_ligneContrat With Id = ad630ba6-684e-e111-92e3-00155d151905 Does Not Exist”

这是我的代码:

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);
}


}
}
}

怎么了???

提前致谢!

编辑 1:好的似乎合乎逻辑,因为记录尚不存在><。只有一件事:如何更改查找字段的值?它的类型是什么?

编辑 2:执行我的代码时没有出现错误,但是事件实体的字段没有更新 ><'....我用 invalidPluginExceptions 测试了我的代码并且到达了代码的末尾。 ..这是代码:

编辑 3:代码已更新...

最佳答案

要回答您的原始问题及其编辑,是的,当核心数据库操作尚未完成时,您不能将记录与另一条记录相关联。

Pre-operation: Stage in the pipeline for plug-ins that are to execute before the main system operation. Plug-ins registered in this stage are executed within the database transaction.

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

为了回答编辑,查找字段属于 EntityReference 类. (看起来您正在处理 1:N 关系?)

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

if (entity.Attributes.ContainsKey("new_lignecontrat"))
{
entity.Attributes["new_lignecontrat"] = YourEntityReference;
}
else //attribute not included in the plugin operation
{
entity.Attributes.Add("new_lignecontrat", YourEntityReference);
}

Microsoft 在 SDK 中对此概念进行了演示:

\sdk\samplecode\cs\plug-ins\accountnumberplugin.cs

关于c# - 关联方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9129220/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com