2011-05-31 46 views
7

我正在使用crmsvcutil生成早期绑定类型。在CRM 4.0天内,只需点击entity.ChildEntities属性即可加载相关实体。CRM2011 - SDK 5.0.3 - Linq to CRM实体问题

//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加载相关实体?

回答

2

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

有一个SDK Version 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:Xrm\Xrm.cs /url:http://Crm/Contoso/XRMServices/2011/Organization.svc /domain:CONTOSO /username:administrator /password:[email protected] /namespace:Xrm /serviceContextName:XrmServiceContext 
控制台应用程序
10

我和你有完全一样的问题。我看到这些属性,并为他们为什么总是返回null感到困惑。他们显然是意图来检索特定关系的实体,但他们似乎是“休眠”。

我想到了,可能上下文对象没有正确配置以延迟加载这些“导航”属性(从实体框架中借用一个术语)。于是我开始研究我所能左右OrganizationServiceContext,发现这一点关于它的LoadProperty方法:

如果属性代表一个协会,链接或推迟属性,调用此方法为客户端提供了一种懒洋洋地加载相关资源。

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

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

因此,使用您的例子,假设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与存取派生类中的所有不同的实体类型在您的组织中。

+0

感谢您的回答。我想我通过使用最新的SDK 5.0.4版本找到了我们问题的答案,该版本带来了更多关于xrm实体类主题的帮助和工作示例。感觉就像第一个SDK版本没有准备好并完成XRM相关的东西,比如实体类。 – 2011-06-18 14:19:34