Entiteiten aan de context koppelen (Dynamics CRM 2015)
Gepubliceerd: november 2016
Is van toepassing op: Dynamics CRM 2015
De OrganizationServiceContext kan wijzigingen in entiteiten en relaties alleen goed bijhouden als de entiteiten en relaties zijn gekoppeld aan de gegevenscontext. Als u het gebruikelijke patroon volgt van entiteiten opvragen, entiteiten bijwerken en de wijzigingen opslaan, hoeft u het koppelen en ontkoppelen van entiteiten niet expliciet te regelen. Entiteiten worden namelijk automatisch aan de context gekoppeld wanneer ze worden opgehaald. Eén ding waarmee u rekening moet houden is dat alle entiteiten door de OrganizationServiceContext worden ontkoppeld nadat de methode SaveChanges is aangeroepen. Als u wilt doorgaan met het gebruik van de gegevenscontext in combinatie met de eerder opgehaalde entiteiten, moeten de entiteiten opnieuw worden gekoppeld. U kunt dat doen door een nieuwe set met entiteiten op te vragen of door expliciet de methode Attach aan te roepen voor de entiteiten. Developer-uitbreidingen Microsoft Dynamics CRM 2015 bieden een ReAttach-methode die ervoor zorgt dat de entiteiten zich in de juiste staat bevinden wanneer ze opnieuw worden gekoppeld. Dit wordt weergegeven in het volgende voorbeeld.
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();
}
Het heeft de voorkeur om alle wijzigingen onder één aanroep van SaveChanges uit te voeren en de context vervolgens te regelen zodat er niet opnieuw hoeft te worden gekoppeld.
De CrmOrganizationServiceContext vereenvoudigt dit scenario door entiteiten automatisch opnieuw te koppelen nadat SaveChanges is aangeroepen. Houd er rekening mee dat alleen de entiteiten die als invoerparameters van een AddObject- of een UpdateObject-bewerking zijn gebruikt, worden gemarkeerd om opnieuw te worden gekoppeld.
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();
}
Meerdere gegevenscontexten
Een ander scenario dat zorgvuldig beheer van entiteittracering vereist is wanneer meerdere gegevenscontexten een gemeenschappelijk entiteitsobject afhandelen. Een voorbeeld is wanneer één context een entiteit ophaalt en een andere context de entiteit bijwerkt. Voordat de entiteit door de tweede context kan worden gewijzigd, moet deze eraan worden gekoppeld. Aangezien een entiteit slechts aan één context kan zijn gekoppeld, moet de entiteit van de broncontext worden ontkoppeld voordat deze aan de tweede context wordt gekoppeld.
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();
}
}
Een entiteit ontkoppelen van de context
Soms is het ongewenst om de entiteit van de oorspronkelijke context te ontkoppelen omdat deze al betrokken kan zijn bij een complexe grafiek van wijzigingen die verbroken zou worden als de entiteit wordt ontkoppeld. Een veiligere aanpak is de tweede context eenvoudig een ander exemplaar van de entiteit te laten ophalen en de oorspronkelijke entiteit ongewijzigd te laten. Een variatie hierop is een kloon van de oorspronkelijke entiteit te maken en de gekloonde entiteit te koppelen aan de tweede context. De helpermethoden AttachClone<T> en MergeClone<T> gebruiken deze laatste methode, waarbij MergeClone<T> extra controles uitvoert om te controleren of de entiteit niet al is gekoppeld aan de doelcontext.
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();
}
}
Zie ook
Attach
SaveChanges
AddObject
UpdateObject
contextobjectmodel ontwikkelaarsuitbreidingen (Dynamics CRM 2015)
De context configureren met het configuratiebestand (Dynamics CRM 2015)
Toegang krijgen tot entiteitsrelaties (Dynamics CRM 2015)
© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht