Programación de enlace en tiempo de ejecución y de enlace en tiempo de compilación con el servicio de la organización

Nota

¿No está seguro de entidad frente a tabla? Vea Desarrolladores: comprender la terminología en Microsoft Dataverse.

Cuando trabaje con los ensamblados del servicio de la organización tiene dos estilos de programación que puede usar: enlace en tiempo de ejecución y enlace en tiempo de compilación.

La diferencia principal entre el enlace anticipado y el enlace en tiempo de ejecución implica la conversión de tipo. Mientras que el enlace anticipado ofrece la comprobación de todos los tipos en tiempo de compilación de modo que no se produzcan conversiones implícitas, el enlace en tiempo de ejecución comprueba los tipos solo cuando se crea el objeto o se realiza una acción en el tipo. La clase Entity requiere que los tipos se especifiquen explícitamente para evitar conversiones implícitas.

El vínculo en tiempo de ejecución le permite trabajar con tablas (entidades) o columnas (atributos) personalizados que no estaban disponibles cuando se el código se compiló.

Enlace en tiempo de ejecución

La programación de enlace en tiempo de ejecución usa la clase Entity donde necesita hacer referencia a las tablas y columnas (entidades y los atributos) que utilizan sus valores de propiedad LogicalName:

Las relaciones no tienen una propiedad LogicalName ni la RelationshipMetadataBase. Se utiliza la propiedad SchemaName .

La ventaja principal para la programación de enlace en tiempo de ejecución es que no necesita generar las clases ni incluir el archivo generado en los proyectos. El archivo generado puede ser muy grande.

Las desventajas principales son:

  • No se obtiene validación del enlace en tiempo de compilación de los nombres de las entidades, los atributos y las relaciones.
  • Necesita conocer los nombres de los atributos y de relaciones en los metadatos.

Sugerencia

Herramienta que puede usar para encontrar esta información fácilmente es el Explorador de metadatos. Se trata de una aplicación que puede descargar e instalar en su organización. Más información: Examinar los metadatos para su entorno

Ejemplo

El siguiente ejemplo crea una cuenta con el estilo de enlace en tiempo de ejecución.

//Use Entity class specifying the entity logical name
var account = new Entity("account");

// set attribute values
    // string primary name
    account["name"] = "Contoso";            
    // Boolean (Two option)
    account["creditonhold"] = false;
    // DateTime
    account["lastonholdtime"] = new DateTime(2017, 1, 1);
    // Double
    account["address1_latitude"] = 47.642311;
    account["address1_longitude"] = -122.136841;
    // Int
    account["numberofemployees"] = 500;
    // Money
    account["revenue"] = new Money(new decimal(5000000.00));
    // Picklist (Option set)
    account["accountcategorycode"] = new OptionSetValue(1); //Preferred customer
                
//Create the account
Guid accountid = svc.Create(account);

Enlace en tiempo de compilación

La programación de enlace en tiempo de compilación requiere que primero genere un conjunto de clases basadas en las definiciones de tabla y columna (metadatos de entidad y atributo) para un entorno específico mediante la herramienta de generación de código (CrmSvcUtil.exe). Más información: Generar clases para programación de enlace en tiempo de compilación con el servicio de la organización

Tras generar tipos de clases en tiempo de compilación con la herramienta de generación de código disfrutará de una mejor experiencia cuando escriba código gracias a las clases y las propiedades usan sus respectivos valores de propiedad SchemaName:

Simplemente, cree instancias de la clase y deje que Visual Studio IntelliSense proporcione los nombres de propiedades y las relaciones.

Las clases generadas para la programación de enlace en tiempo de compilación también pueden incluir las definiciones para cualquier acción personalizada que se definan para el entorno. Esto le brindará un par de clases de solicitud y respuesta para su uso con con estas acciones personalizadas. Más información: Acciones personalizadas

También hay una opción para ampliar la herramienta de generación de código para cambiar la salida. Una extensión crea enumeraciones para cada valor de opción de optionset (elecciones). Esto proporciona una mejor experiencia porque no tiene que buscar el valor entero para cada elección. Más información: Crear extensiones para la herramienta de generación de código.

Las clases se generan mediante definiciones de tabla desde una instancia de entorno específica, y cada instancia puede tener distintas tablas y columnas donde estos pueden cambiar a lo largo del tiempo. Es posible que tenga que escribir código que funcione con tablas que no estén presentes cuando genera clases con establecimiento inflexible de tipos.

Importante

Si usa OrganizationServiceProxy para proporcionar los métodos IOrganizationService que se usará, debe invocar al método OrganizationServiceProxy.EnableProxyTypes() para habilitar tipos de enlace en tiempo de compilación.

Ejemplo

El siguiente ejemplo crea una cuenta con el estilo de enlace en tiempo de compilación.

var account = new Account();
// set attribute values
    // string primary name
    account.Name = "Contoso";
    // Boolean (Two option)
    account.CreditOnHold = false;
    // DateTime
    account.LastOnHoldTime = new DateTime(2017, 1, 1);
    // Double
    account.Address1_Latitude = 47.642311;
    account.Address1_Longitude = -122.136841;
    // Int
    account.NumberOfEmployees = 500;
    // Money
    account.Revenue = new Money(new decimal(5000000.00));
    // Picklist (Option set)
    account.AccountCategoryCode = new OptionSetValue(1); //Preferred customer

//Create the account
Guid accountid = svc.Create(account);

Elegir un estilo

El estilo de programación que elija depende de usted. La siguiente tabla ofrece las ventajas y las desventajas de cada uno.

Enlace en tiempo de compilación Enlace en tiempo de ejecución
Puede comprobar los nombres de entidad, atributo y relación en tiempo de compilación No puede compilar la comprobación de los nombres de entidad, atributo y relación
Debe generar clases de entidad No necesita generar tipos de entidad
Mejor compatibilidad con IntelliSense Menor compatibilidad con IntelliSense
Menos código y más legible Más código y menos legible
Ligeramente menos rendimiento Ligeramente más rendimiento

Combinación de enlace en tiempo de ejecución y en tiempo de compilación

Porque todas las clases heredan desde la clase Entity que se utiliza con programación de enlace en tiempo de ejecución, puede trabajar con las entidades, los atributos y las relaciones no definidas en las clases.

Ejemplos

El siguiente ejemplo muestra una forma de mezclar los de enlace en tiempo de ejecución y en tiempo de compilación utilizando OrganizationServiceContext.

// Create an organization service context object  
AWCServiceContext context = new AWCServiceContext(_serviceProxy);  
  
// Instantiate an account object using the Entity class.  
Entity testaccount = new Entity("account");  
  
// Set several attributes. For account, only the name is required.   
testaccount["name"] = "Fourth Coffee";  
testaccount["emailaddress1"] = "marshd@contoso.com";  
  
// Save the entity using the organization service context object.  
context.AddToAccountSet(testaccount);  
context.SaveChanges();  
  

Si un atributo personalizado no estaba incluido en las clases generadas, aún puede usarlo.

var account = new Account();
// set attribute values
    // string primary name
    account.Name = "Contoso";
    // A custom boolean attribute not included in the generated classes.
    account["sample_customboolean"] = false;


//Create the account
Guid accountid = svc.Create(account);

Asignar una instancia con enlace en tiempo de compilación a una instancia con enlace en tiempo de ejecución

El siguiente ejemplo muestra cómo asignar una instancia con enlace en tiempo de compilación a una instancia con enlace en tiempo de ejecución.

Entity incident = ((Entity)context.InputParameters[ParameterName.Target]).ToEntity<Incident>();  
Task relatedEntity = new Task() { Id = this.TaskId };  
  
incident.RelatedEntities[new Relationship("Incident_Tasks")] =   
new EntityCollection(new Entity[] { relatedEntity.ToEntity<Entity>() });  

Consultar también

Operaciones de la entidad con el servicio de organización
Crear filas de tabla con el servicio de la organización
Recuperar una fila de tabla usando un servicio de organización
Consulta de datos duplicados con el servicio de organización
Actualizar y eliminar filas de tabla con el servicio de la organización
Asociar y desasociar filas de tablas con el servicio de la organización
Interfaz IOrganizationService
Uso de OrganizationServiceContext

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).