使用 C# 更新 CRM 中的实体字段
Update an Entity field in CRM using C#
我正在尝试使用 C# 更新 CRM 中实体的字段值,但我不确定应该怎么做。
下面是我当前的代码:
var helper = new CRMConnection();
var service = helper.OpenConnection();
var entiyRef = new Entity("financialaid");
string fetchXML = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='financialaid'>
<attribute name='financialaidid' />
<attribute name='emailcontent' />
</entity>
</fetch>";
var retrieved = service.RetrieveMultiple(new FetchExpression(fetchXML));
if (retrieved != null && retrieved.Entities.Count > 0){
for (var k = 0; k < retrieved .Entities.Count; i++){
var emailContent = retrieved .Entities[i].GetAttributeValue<string>("emailcontent");
entiyRef["emailcontent"] = "test";
service.Update(entiyRef);
}
}
上面的代码返回了 5000
条记录,我想它与我在 CRM 中的每条记录相关联。但我只是想更新实体中的独立字段。
之后出现如下错误退出。
Exception thrown: 'System.ServiceModel.FaultException`1' in
Microsoft.Xrm.Sdk.dll
请问如何使用 FetchXML 正确更新 CRM 中的字段?
attributeId = 0AB038CE-E57E-EA11-A811-000D3AA3E77C
entityId = b6abe6f6-a876-4a80-87d6-2f1b179d437f
您在错误的实体中创建了 emailContent 字段。如果您在该实体中有超过 5,000 条记录,则该实体很可能存储交易数据。
我建议您使用具有键字段和值字段的自定义配置实体(如果有,则创建配置实体)。
为键指定一个唯一名称,然后将 html table 存储到该值字段中。
通过键检索该记录,然后您可以从值字段中 update/read html table。
第一个问题是您将 entityRef
实例化为 new Entity("financialaid")
但您从未分配该对象的 Id
属性,因此 service.Update(entityRef)
调用将尝试更新具有 financialaidid = Guid.Empty
的财务援助实体的记录,该记录不应存在。
使用一些 Linq 表达式或简单的 foreach 可以大大简化结果循环。
循环也没有真正意义,因为您每次都在更新相同的记录(id 为空的 financialaid 记录)。
如果您要完成的是更新实体 financialaid 的每条记录并将 emailcontent 属性设置为 "test",请将其放入您的循环中:
var entityRef = new Entity(retrieved.Entities.LogicalName, retrieved.Entities.Id);
entityRef["emailcontent"] = "test";
service.Update(entityRef);
请注意,FetchXML 只是一种查询语言,您不能使用 FetchXML 更新记录。将其视为 SQL 的 select 语句。
最后,如果您只想批量更新所有 financialaid 记录以设置字段的值,我建议您为此使用现有工具,而不是编写一次性应用程序来执行此操作。在这种情况下,XrmToolBox 中的 批量数据更新程序 工具可以完成这项工作。
我正在尝试使用 C# 更新 CRM 中实体的字段值,但我不确定应该怎么做。
下面是我当前的代码:
var helper = new CRMConnection();
var service = helper.OpenConnection();
var entiyRef = new Entity("financialaid");
string fetchXML = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='financialaid'>
<attribute name='financialaidid' />
<attribute name='emailcontent' />
</entity>
</fetch>";
var retrieved = service.RetrieveMultiple(new FetchExpression(fetchXML));
if (retrieved != null && retrieved.Entities.Count > 0){
for (var k = 0; k < retrieved .Entities.Count; i++){
var emailContent = retrieved .Entities[i].GetAttributeValue<string>("emailcontent");
entiyRef["emailcontent"] = "test";
service.Update(entiyRef);
}
}
上面的代码返回了 5000
条记录,我想它与我在 CRM 中的每条记录相关联。但我只是想更新实体中的独立字段。
之后出现如下错误退出。
Exception thrown: 'System.ServiceModel.FaultException`1' in Microsoft.Xrm.Sdk.dll
请问如何使用 FetchXML 正确更新 CRM 中的字段?
attributeId = 0AB038CE-E57E-EA11-A811-000D3AA3E77C
entityId = b6abe6f6-a876-4a80-87d6-2f1b179d437f
您在错误的实体中创建了 emailContent 字段。如果您在该实体中有超过 5,000 条记录,则该实体很可能存储交易数据。
我建议您使用具有键字段和值字段的自定义配置实体(如果有,则创建配置实体)。
为键指定一个唯一名称,然后将 html table 存储到该值字段中。
通过键检索该记录,然后您可以从值字段中 update/read html table。
第一个问题是您将 entityRef
实例化为 new Entity("financialaid")
但您从未分配该对象的 Id
属性,因此 service.Update(entityRef)
调用将尝试更新具有 financialaidid = Guid.Empty
的财务援助实体的记录,该记录不应存在。
使用一些 Linq 表达式或简单的 foreach 可以大大简化结果循环。 循环也没有真正意义,因为您每次都在更新相同的记录(id 为空的 financialaid 记录)。
如果您要完成的是更新实体 financialaid 的每条记录并将 emailcontent 属性设置为 "test",请将其放入您的循环中:
var entityRef = new Entity(retrieved.Entities.LogicalName, retrieved.Entities.Id);
entityRef["emailcontent"] = "test";
service.Update(entityRef);
请注意,FetchXML 只是一种查询语言,您不能使用 FetchXML 更新记录。将其视为 SQL 的 select 语句。
最后,如果您只想批量更新所有 financialaid 记录以设置字段的值,我建议您为此使用现有工具,而不是编写一次性应用程序来执行此操作。在这种情况下,XrmToolBox 中的 批量数据更新程序 工具可以完成这项工作。