Partager via


Attacher des entités au contexte (Dynamics CRM 2015)

 

Date de publication : novembre 2016

S’applique à : Dynamics CRM 2015

Pour que OrganizationServiceContext assure le suivi correct des modifications apportées aux entités et relations, ces dernières doivent être attachées au contexte de données. Lorsque vous suivez le modèle standard de recherche d’entités, de mise à jour des entités et d’enregistrement des modifications, il n’est pas nécessaire de contrôler explicitement l’attachement et le détachement des entités. Les entités sont automatiquement attachées au contexte quand elles sont récupérées. Un comportement à savoir est que toutes les entités sont détachées par OrganizationServiceContext après l’appel de la méthode SaveChanges. Pour continuer à utiliser le contexte de données par rapport aux entités précédemment récupérées, les entités doivent être rattachées. Pour ce faire, recherchez un nouvel ensemble d’entités ou appelez explicitement la méthode Attach sur les entités. Les extensions développeur pour Microsoft Dynamics CRM 2015 fournissent une méthode ReAttach qui garantit que les entités sont dans l’état approprié lors de leur rattachement. Ceci est illustré dans l’exemple suivant.

using Microsoft.Xrm.Client;

using (var service = new OrganizationService(connection))
using (var context = new OrganizationServiceContext(service))
{
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
contact.JobTitle = "Developer";
context.UpdateObject(contact);
context.SaveChanges();

// contact is no longer attached at this point so reattach it
context.Reattach(contact);

contact.EMailAddress1 = "bob@contoso.com";
context.UpdateObject(contact);
context.SaveChanges();
}

Il est préférable d’appliquer toutes les modifications dans un appel unique à SaveChanges, puis de supprimer le contexte, pour éviter d’avoir à rattacher les entités.

CrmOrganizationServiceContext simplifie ce scénario en rattachant automatiquement les entités après l’appel de SaveChanges. Notez que seules les entités utilisées comme paramètres d’entrée d’une opération AddObject ou UpdateObject sont marquées pour être rattachées.

using (var service = new OrganizationService(connection))
using (var context = new CrmOrganizationServiceContext(service))
{
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
contact.JobTitle = "Developer";
context.UpdateObject(contact);
context.SaveChanges();
contact.EMailAddress1 = "bob@contoso.com";
context.UpdateObject(contact);
context.SaveChanges();
}

Contextes de données multiples

Un autre scénario nécessitant une gestion rigoureuse du suivi des entités est lorsque plusieurs contextes de données gèrent un objet entité commun. Par exemple, un contexte récupère une entité et un deuxième contexte met à jour l’entité. Pour que l’entité soit modifiée par le deuxième contexte, elle doit lui être attachée. Étant donné qu’une entité ne peut être attachée qu’à un seul contexte, il est nécessaire de la détacher du contexte source pour l’attacher au deuxième contexte.

using (var service = new OrganizationService(connection))
using (var context1 = new OrganizationServiceContext(service))
{
var contact = context1.CreateQuery<Contact>().First(c => c.FirstName == "Bob");

using (var context2 = new OrganizationServiceContext(service))
{
context1.Detach(contact);
context2.Attach(contact);

contact.EMailAddress1 = "bob@contoso.com";
context2.UpdateObject(contact);
context2.SaveChanges();
}
}

Détacher une entité du contexte

Il est parfois déconseillé de détacher l’entité du contexte d’origine, car elle peut déjà être impliquée dans un graphique complexe de modifications qui seraient rompues en cas de détachement. Une approche plus sûre est que le deuxième contexte récupère simplement une instance distincte de l’entité sans modifier l’entité d’origine. Une variante de cette approche consiste à cloner l’entité d’origine et à attacher l’entité clonée au deuxième contexte. Les méthodes d’assistance AttachClone<T> et MergeClone<T> adoptent la dernière approche, où MergeClone<T> effectue des contrôles supplémentaires pour vérifier que l’entité n’est pas déjà attachée au contexte cible.

using (var service = new OrganizationService(connection))
using (var context1 = new OrganizationServiceContext(service))
{
var contact = context1.CreateQuery<Contact>().First(c => c.FirstName == "Bob");

using (var context2 = new OrganizationServiceContext(service))
{
var contact2 = context2.MergeClone(contact);

contact2.EMailAddress1 = "bob@contoso.com";
context2.UpdateObject(contact2);
context2.SaveChanges();
}
}

Voir aussi

Attach
SaveChanges
AddObject
UpdateObject
Modèle d’objet de contexte des extensions développeur (Dynamics CRM 2015)
Configurer le contexte avec le fichier de configuration (Dynamics CRM 2015)
Accéder aux relations d'entité (Dynamics CRM 2015)

© 2017 Microsoft. Tous droits réservés. Copyright