2011-05-31 59 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