2011-05-31 18 views
7

Estoy usando crmsvcutil para generar tipos enlazados iniciales. En los crm 4.0 días uno pudo cargar entidades relacionadas simplemente al presionar la propiedad entity.ChildEntities.CRM2011 - SDK 5.0.3 - Problema de entidades de CRM a 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(); 
     } 
    }  
    } 

Cuando hago esto con la última versión del SDK de CRM 2011 en lugar de entidades de carga realted estoy un NullReferenceException que me da ninguna información adicional sobre el tema.

foreach (var c in a.contact_customer_accounts) 

¿Qué debo hacer? ¿Cómo puedo cargar entidades relacionadas con CRM2011 Linq?

Respuesta

2

Realmente no tengo ni idea de por qué es así, pero después de algunas sesiones de investigación tuve que usar el conjunto de personalización de código provisto xrm para generar las clases de modelo de objeto de entidad.

Se proporciona una muestra del SDK Versión 5.0.4 que crea una consola de muestra que muestra cómo generar y consumir las clases de entidad de una manera en la que todos estamos acostumbrados desde los días de CRM 4.0 xrm.

Para hacer una larga historia corta que publico la llamada crmsvcutil aquí, para más información usted debe consultar a la muestra SDK Tutorial: crear una aplicación de consola que se conecta a Microsoft Dynamics CRM 2011 Usando extensiones para programadores de 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

Estaba teniendo exactamente el mismo problema que usted. Vi esas propiedades y me quedé perplejo de por qué siempre devolvían null. Claramente eran destinados para recuperar entidades para una relación particular, sin embargo, parecían estar "latentes".

Se me ocurrió que tal vez el objeto de contexto no estaba configurado correctamente para cargar estas propiedades de "navegación" (para tomar prestado un término de Entity Framework). Así que me puse a investigar lo que pude sobre OrganizationServiceContext, y éste nos pareció poco sobre su LoadProperty método:

Si la propiedad representa una asociación, vínculo o la propiedad diferido, llamar a este método proporciona al cliente una forma de cargar con pereza recursos relacionados .

Eso sonó como lo que necesitaba, y una de las sobrecargas toma un Entity y una Relationship como entrada. Entonces, una vez que tenga una instancia de una entidad con una o más relaciones, debe solicitar al contexto que cargue las propiedades correspondientes. Tenga en cuenta que la entidad debe estar unida al contexto, ya sea de forma automática (porque recuperó la entidad a través de context query), o manualmente utilizando el método Attach.

Estoy un poco confundido por su código porque está utilizando un objeto CrmDataContext en lugar de un objeto OrganizationServiceContext. Los ejemplos de código en el SDK 2011 usan este último, y el crmsvcutil incluso generará una instancia personalizada de OrganizationServiceContext con métodos en forma de "[ENTITY_NAME] Establecer" (es decir, AccountSet como en su ejemplo). Es posible que deba cambiar al tipo de contexto más nuevo.

Por lo tanto, la utilización de su ejemplo y suponiendo dc es ahora una instancia de OrganizationServiceContext, que se vería así:

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(); 
    } 

} 

Es un dolor tener que cargar manualmente cada relación, pero no puedo encontrar ninguna otra manera de activar esas propiedades.


Nota: Para obtener crmsvcutil para generar una costumbre OrganizationServiceContext, especificar el serviceContextName interruptor:

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

Esto crearía una clase derivada llamada XrmServiceContext con descriptores de acceso para todos los diferentes entidad tipos en su organización.

+0

Gracias por su respuesta. Creo que encontré la respuesta a nuestro problema utilizando la versión más reciente de SDK 5.0.4 que brinda más ayuda y una muestra de trabajo sobre el tema de la clase de entidad xrm. Parece que las primeras versiones de SDK no estaban listas y terminadas para cosas relacionadas con XRM como clases de entidad. –

Cuestiones relacionadas