Collega entità al contesto (Dynamics CRM 2015)
Data di pubblicazione: novembre 2016
Si applica a: Dynamics CRM 2015
Affinché OrganizationServiceContext tenga correttamente traccia delle modifiche relative alle entità e alle relazioni, le entità e le relazioni devono essere collegati al contesto di dati. Se si segue il tipico modello di eseguire query per le entità, aggiornando le entità e salvando le modifiche, non è necessario controllare in modo esplicito controllare il collegamento e lo scollegamento delle entità. Ovvero, le entità vengono automaticamente collegate al contesto quando vengono recuperate. Un comportamento di cui essere a conoscenza è che tutte le entità vengono scollegate da OrganizationServiceContext dopo aver chiamato il metodo SaveChanges. Per continuare a utilizzare il contesto di dati con le entità precedente recuperare, le entità devono essere ricollegate. È possibile eseguire questa operazione eseguendo nuovamente una query in un nuovo set di entità o chiamando in modo esplicito il metodo Attach nelle entità. Le estensioni per gli sviluppatori per Microsoft Dynamics CRM 2015 offrono un metodo ReAttach che garantisce che le entità sono nello stato corretto quando vengono ricollegate. Nel seguente esempio viene riportato quanto sopra.
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();
}
La preferenze è applicare tutte le modifiche in una singola chiamata a SaveChanges e quindi eliminare il contesto per evitare la necessità di ricollegare.
CrmOrganizationServiceContext semplifica questo scenario automaticamente ricollegando le entità dopo aver chiamato SaveChanges. Si noti che solo le entità utilizzate come parametri di input in un'operazione UpdateObject o AddObject sono contrassegnati per essere ricollegati.
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();
}
Più contesti di dati
Un altro scenario che richiede una gestione attenta della registrazione entità è di avere più contesti di dati che gestiscono un oggetto entità comune. Un esempio è rappresentato da un contesto che recupera un'entità e di secondo che aggiorna l'entità. Prima che l'entità possa essere modificata dal secondo contesto, deve essere collegata a questo. Poiché un'entità può solo essere collegata a un singolo contesto, è necessario scollegare l'entità dal contesto di origine prima di collegarla al secondo contesto.
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();
}
}
Scollegare un'entità dal contesto
Talvolta è meglio non scollegare l'entità dal contesto originale perché potrebbe già essere presente in un grafico complesso di cambiamenti che sarebbero interrotti in caso di scollegamento. Un approccio più sicuro è di fare in modo che il secondo contesto semplicemente richiami un'istanza distinta e lasci l'entità originale inutilizzata. Una variazione di questo approccio è di clonare completamente l'entità originale e di collegare l'entità duplicata al secondo contesto. I metodi helper AttachClone<T> e MergeClone<T> adottano l'ultimo approccio in cui MergeClone<T> esegue controlli aggiuntivi per assicurare che l'entità non sia già collegata al contesto di destinazione.
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();
}
}
Vedere anche
Attach
SaveChanges
AddObject
UpdateObject
Modello a oggetti del contesto delle estensioni per gli sviluppatori (Dynamics CRM 2015)
Configurare il contesto con il file di configurazione (Dynamics CRM 2015)
Relazioni tra entità di accesso (Dynamics CRM 2015)
© 2017 Microsoft. Tutti i diritti sono riservati. Copyright