dynamics crm 2011-CRM2011-SDK 5.0.3-Linq to crm实体问题



我正在使用crmsvcutil生成早期绑定类型。在crm 4.0时代,只需点击实体就可以加载相关实体。ChildEntitys属性。

  //Winvs.Next.Entities.CrmDataContext dc = new Entities.CrmDataContext(new Microsoft.Xrm.Sdk.Client.OrganizationServiceContext(
  var cred = new System.ServiceModel.Description.ClientCredentials();
  cred.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
  //      
  using (var organizationServiceProxy = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy(new Uri(System.Configuration.ConfigurationManager.ConnectionStrings["CrmConnection"].ConnectionString), null, cred, null))
  using (Winvs.Next.Entities.CrmDataContext dc = new Entities.CrmDataContext(organizationServiceProxy))
  {
    // This statement is required to enable early-bound type support.
    organizationServiceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new Microsoft.Xrm.Sdk.Client.ProxyTypesBehavior());
    //
    foreach (var a in dc.AccountSet)
    {
      foreach (var c in a.contact_customer_accounts)
      {
        c.FullName.ToString();
      }
    }       
  }

当我使用最新的CRM 2011 SDK版本而不是加载实际实体时,我会得到一个NullReferenceException,它不会给我提供有关该问题的更多信息。

foreach (var c in a.contact_customer_accounts)

我想念什么?如何使用CRM2011 Linq加载相关实体?

我遇到了和你完全相同的问题。我看到了这些属性,很困惑为什么它们总是返回null。它们显然是为了检索特定关系的实体,但它们似乎处于"休眠状态"

我突然想到,上下文对象可能没有正确配置为延迟加载这些"导航"属性(借用实体框架中的一个术语)。所以我开始尽我所能研究OrganizationServiceContext,并发现了它的LoadProperty方法:

如果属性表示关联、链接或延迟属性,则调用此方法将为客户端提供一种延迟加载相关资源的方法。

这听起来像是我需要的,其中一个重载将EntityRelationship作为输入。因此,一旦您拥有一个具有一个或多个关系的实体实例,就需要请求上下文加载相应的属性。请记住,实体必须自动附加到上下文(因为您通过上下文查询检索到实体),或者使用Attach方法手动附加到上下文。

我对您的代码有点困惑,因为您使用的是CrmDataContext对象而不是OrganizationServiceContext对象。2011 SDK中的代码示例使用了后者,crmsvcutil甚至会生成一个OrganizationServiceContext的自定义实例,其中包含"[ENTITY_NAME]Set"形式的方法(即您的示例中的AccountSet)。您可能需要切换到较新的上下文类型。

因此,使用您的示例并假设dc现在是OrganizationServiceContext的实例,它看起来像:

Relationship contactRel = new Relationship("contact_customer_accounts");
foreach (var a in dc.AccountSet) {
    dc.LoadProperty(a, contactRel); // Tell context to load entities from this relationship
    foreach (var c in a.contact_customer_accounts) {
        c.FullName.ToString();
    }
}

必须手动加载每个关系是一件痛苦的事,但我找不到其他激活这些属性的方法。


注意:要让crmsvcutil生成自定义OrganizationServiceContext,请指定serviceContextName开关:

crmsvcutil.exe /url:<your_crm_url> /out:Xrm.cs /serviceContextName:XrmServiceContext

这将创建一个名为XrmServiceContext的派生类,该类具有组织中所有不同实体类型的访问器。

我真的不知道为什么会这样,但经过一些研究,我们不得不使用xrm提供的代码自定义程序集来生成实体对象模型类。

提供了一个SDK 5.0.4版本的示例,它构建了一个示例控制台,展示了如何以我们在CRM 4.0 xrm时代都使用的方式生成和使用实体类。

长话短说,我在这里发布了crmsvcutil调用,有关更多信息,您应该参阅sdk示例演练:使用开发人员扩展构建连接到Microsoft Dynamics CRM 2011的控制台应用程序http://technet.microsoft.com/en-us/library/gg695803.aspx

CrmSvcUtil.exe /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration" /out:XrmXrm.cs /url:http://Crm/Contoso/XRMServices/2011/Organization.svc /domain:CONTOSO /username:administrator /password:pass@word1 /namespace:Xrm /serviceContextName:XrmServiceContext

相关内容

  • 没有找到相关文章

最新更新