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

时间:2016-01-19 10:59:04

标签: dynamics-crm-2011 dynamics-crm dynamics-crm-2013 dynamics-crm-2015

我正在转换/升级应用程序以使用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;
}

1 个答案:

答案 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