CrmServiceContext 未加载与 CRM 2015 Online 的关系数据

CrmServiceContext not loading relationship data with CRM 2015 Online

我正在 convert/upgrade 申请使用 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