【问题标题】:CRM2011 - SDK 5.0.3 - Linq to CRM Entities ProblemCRM2011 - SDK 5.0.3 - Linq 到 CRM 实体问题
【发布时间】:2011-09-05 06:34:15
【问题描述】:

我正在使用 crmsvcutil 生成早期绑定类型。在 crm 4.0 天,只需点击 entity.ChildEntities 属性即可加载相关实体。

  //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 版本而不是加载 realted 实体执行此操作时,我得到了 NullReferenceException,它没有提供有关该问题的更多信息。

foreach (var c in a.contact_customer_accounts)

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

【问题讨论】:

    标签: linq dynamics-crm-2011


    【解决方案1】:

    我遇到了和你一样的问题。我看到了这些属性,对为什么它们总是返回 null 感到困惑。它们显然是打算检索特定关系的实体,但它们似乎是“休眠的”。

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

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

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

    我对您的代码有点困惑,因为您使用的是CrmDataContext 对象而不是OrganizationServiceContext 对象。 2011 SDK 中的代码示例使用后者,并且 crmsvcutil 甚至会使用“[ENTITY_NAME]Set”形式的方法生成OrganizationServiceContext 的自定义实例(即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 的派生类,其中包含您组织中所有不同实体类型的访问器。

    【讨论】:

    • 感谢您的回答。我想我通过使用最新的 SDK 5.0.4 版本找到了我们问题的答案,它带来了更多帮助和有关 xrm 实体类主题的工作示例。感觉就像实体类等 XRM 相关的东西,第一个 SDK 版本还没有准备好和完成。
    【解决方案2】:

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

    提供了一个 SDK 版本 5.0.4 示例,该示例构建了一个示例控制台,展示了如何以我们从 CRM 4.0 xrm 天开始使用的方式生成和使用实体类。

    长话短说,我在此处发布了 crmsvcutil 调用,有关更多信息,您应该查阅 sdk 示例演练:使用开发人员扩展 @987654321 构建连接到 Microsoft Dynamics CRM 2011 的控制台应用程序 @

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2011-11-09
      • 2013-11-27
      • 2013-06-29
      • 2018-07-10
      • 2011-12-27
      相关资源
      最近更新 更多