我正在转换/升级应用程序以使用 CRM 2015 Online 而不是 CRM 2011。但是它无法使用 CRM 2015 通过连接加载关系数据。但是它正在与 CRM 2011 配合使用。我已经创建了实体使用最新的 CRM 2015 SDK 的包装器。
检索订单的代码
var context = GetNewContext();
var ordersToProcess = (from o in context.SalesOrderSet
where o.SalesOrderId == orderId
select o).Distinct().ToList();
foreach (var salesOrder in ordersToProcess)
{
// *** Error Here ***
// *** CRM 2015 Code is throwing error here because transactioncurrency_salesorder is null ***
var urrencyCode =
salesOrder.transactioncurrency_salesorder.ISOCurrencyCode;
}
使用 CRM 2011 代码生成连接
public static CrmServiceContext GetNewContext(CrmConnection conn)
{
var context = new CrmServiceContext(conn);
return context;
}
使用 CRM 2015 在线代码生成连接
public static IOrganizationService GetNewService(CrmConnection conn)
{
var service = new OrganizationService(conn);
return service;
}
public static CrmServiceContext GetNewContext(CrmConnection conn)
{
var context = new CrmServiceContext(GetNewService(conn));
return context;
}
最佳答案
transactioncurrency_salesorder
是销售订单和货币之间的 N:1 关系。
如果您的上下文继承自 OrganizationServiceContext
(我假设您的 2015 代码就是这种情况),则默认情况下不会加载这些关系。您可以通过调用LoadProperty来延迟加载它们在访问关系之前:
context.LoadProperty(salesOrder, "transactioncurrency_salesorder");
如果您的上下文继承自 CrmOrganizationServiceContext
(我认为您的 2011 代码就是这种情况),relationships are automatically lazy loaded .
或者,如果您不需要实际加载货币本身(并且只需要货币的名称或 Guid),则可以使用 EntityReference TransactionCurrencyId
。这始终是设置的,也无需调用 LoadProperty 。你可以例如获取货币名称如下:
salesOrder.TransactionCurrencyId.Name
关于dynamics-crm-2011 - CrmServiceContext 未加载 CRM 2015 Online 的关系数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34875010/