Programmation avec liaison tardive et anticipée à l’aide du SDK pour .NET
Lorsque vous utilisez les assemblys du SDK pour .NET, deux styles de programmation sont à votre disposition : liaison tardive et liaison anticipée.
La différence essentielle entre la liaison anticipée et la liaison tardive implique la conversion de type. Alors que la liaison anticipée fournit le contrôle à la compilation de tous les types afin qu’aucun cast implicite ne se produise, la liaison tardive ne contrôle les types que lorsque l’objet est créé ou qu’une action est exécutée sur le type. La classe Entity nécessite que les types soient explicitement spécifiés pour empêcher les casts implicites.
La liaison tardive vous permet d’utiliser les tables (entités) personnalisées ou les colonnes (attributs) non disponibles au moment de la compilation de votre code.
Liaison tardive
La programmation avec liaison tardive utilise la classe Entity où vous devez faire référence aux lignes de tables et aux colonnes (entités et aux attributs) en utilisant leurs valeurs de propriété LogicalName
:
Les relations n’ont pas de propriété LogicalName
, aussi la propriété RelationshipMetadataBase.SchemaName est utilisée.
L’avantage principale pour la programmation avec liaison tardive n’est autre que vous n’avez pas besoin de générer les classes ou d’inclure le fichier généré dans vos projets. Le fichier généré peut être volumineux.
Les principaux inconvénients sont les suivants :
- Vous n’obtenez pas la validation de la compilation des noms des entités, attributs et relations.
- Vous devez connaître les noms des attributs et des relations dans les métadonnées.
Conseil
Un outil que vous pouvez utiliser pour trouver facilement ces informations n’est autre que Metadata Browser. Cette application est disponible au téléchargement pour être installée dans votre organisation. Pour plus d’informations : Parcourir les métadonnées de votre environnement
Exemple
L’exemple suivant crée un compte à l’aide du style avec liaison tardive.
//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);
Liaison anticipée
La programmation avec liaison anticipée exige que vous génériez tout d’abord une série de classes selon les définitions de tables et de colonnes (métadonnées d’entité et d’attribut) pour un environnement spécifique à l’aide de l’outil de génération du code Commande de build CLI pac modelbuilder Power Platform. Pour plus d’informations : Générer des classes pour la programmation avec liaison anticipée à l’aide du SDK pour .NET
Après avoir généré des classes avec liaison anticipée avec l’outil de génération de code, vous bénéficierez d’une meilleure expérience lors de l’écriture du code parce que les classes et les propriétés utilisent les valeurs de propriété SchemaName
respectives :
Instanciez simplement la classe et laissez Visual Studio IntelliSense fournir les noms des propriétés et des relations.
Les classes générées pour la programmation avec liaison anticipée peuvent également inclure des définitions pour toute action personnalisée définie pour l’environnement. Cela vous fournit une paire de classes de requête et de réponse à utiliser avec ces actions personnalisées. Pour plus d’informations : Personnaliser les actions
Les classes sont générées à l’aide de définitions de table à partir d’une instance d’environnement spécifique, et chaque instance peut avoir des tables et des colonnes différentes où elles peuvent changer au fil du temps. Vous devez écrire le code pour exploiter les tables qui ne sont pas présentes lorsque vous générez les classes fortement typées.
Important
Si vous utilisez le OrganizationServiceProxy pour fournir les méthodes IOrganizationService que vous allez utiliser, vous devez appeler la méthode OrganizationServiceProxy.EnableProxyTypes() pour activer les types avec liaison anticipée.
Exemple
L’exemple suivant crée un compte à l’aide du style avec liaison anticipée.
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);
Sélectionnez votre style
C’est à vous de choisir le style de programmation que vous allez utiliser. Le tableau suivant offre les avantages et les inconvénients pour chacun.
Liaison anticipée | Liaison tardive |
---|---|
Vous pouvez vérifier les noms d’entité, d’attribut et de relation lors de la compilation | Pas de vérification des noms d’entité, d’attribut et de relation lors de la compilation |
Vous devez générer des classes d’entité | Vous ne devez pas générer de classes d’entité |
Meilleur support IntelliSense | Moins de support IntelliSense |
Moins de code à écrire ; le code est plus lisible | Plus de code à écrire ; le code est moins lisible |
Très légèrement moins performant | Très légèrement plus performant |
Combiner la liaison anticipée et la liaison tardive
Toutes les classes générées viennent de la classe Entity utilisée avec la programmation à liaison tardive. Vous pouvez donc travailler avec les entités, les attributs et les relations non définies dans les classes.
Exemples
Cet exemple propose une solution pour combiner les méthodes de liaison anticipée et de liaison tardive avec OrganizationServiceContext.
// Create an 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 context object.
context.AddToAccountSet(testaccount);
context.SaveChanges();
Si un attribut personnalisé n’était pas inclus dans les classes générées, vous pouvez toujours l’utiliser.
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);
Attribuer une instance de liaison anticipée à une instance de liaison tardive
Cet exemple montre comment attribuer une instance de liaison anticipée à une instance de liaison tardive.
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>() });
Voir aussi
Opérations d’entité utilisant le SDK pour .NET
Créer des lignes de table à l’aide du SDK pour .NET
Récupérer une ligne de table à l’aide du SDK pour .NET
Interroger les données à l’aide du SDK pour .NET
Mettre à jour et supprimer des lignes de table à l’aide du SDK pour .NET
Associer et dissocier des lignes de tables à l’aide du SDK pour .NET
Interface IOrganizationService
Utiliser OrganizationServiceContext
Notes
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).