我正在转换/升级应用程序以使用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;
}
答案 0 :(得分:1)
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