linq - CRM2011 - SDK 5.0.3 - Linq 到 CRM 实体问题

标签 linq dynamics-crm-2011

我正在使用 crmsvcutil 生成早期绑定(bind)类型。在 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 加载相关实体?

最佳答案

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

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

If the property represents an association, link or deferred property, calling this method provides the client a way to lazily load related resources.



这听起来像我需要的,其中一个重载需要 EntityRelationship作为输入。因此,一旦您拥有一个具有一个或多个关系的实体实例,您就需要请求上下文来加载相应的属性。请记住,实体必须自动附加到上下文中(因为您通过 context query 检索了实体),或者手动使用 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 , 指定 服务上下文名称 转变:
crmsvcutil.exe /url:<your_crm_url> /out:Xrm.cs /serviceContextName:XrmServiceContext

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

关于linq - CRM2011 - SDK 5.0.3 - Linq 到 CRM 实体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6184323/

相关文章:

javascript - Dynamics CRM 自定义表单事件 Javascript 中出现错误

c# - 将 Dynamics CRM 从 2011 升级到 2016

C#:委托(delegate),紧凑访问者, "universal callable"参数类型

c# - JSON 文件和 LINQ 求和与分组

linq - 使用 Reactives 合并分块消息

object - XRM/Dynamics CRM 2011 中 OrganizationServiceProxy 的连接/对象池

c# - 动态 Linq - String.Split

c# - LINQ .OrderBy由单个字母然后由另一个字母

dynamics-crm-2011 - 删除与特定实体有关的审计日志数据

c# - 如何在 CRM 2011 中创建和删除多对多实体关系中的数据?