Knytte objekter til konteksten (Dynamics CRM 2015)
Udgivet: november 2016
Gælder for: Dynamics CRM 2015
Hvis OrganizationServiceContext skal kunne spore sine ændringer i objekter og relationer effektivt, skal objekterne og relationerne knyttes til datakonteksten. Når du følger det typiske mønster for forespørgsler på objekter, opdatering af objekterne og lagring af ændringerne, er det ikke nødvendigt udtrykkeligt at kontrollere tilknytningen og fjernelse af tilknytningen af objekter. Det vil sige, at objekter automatisk knyttes til konteksten, når de hentes. Et problem at være opmærksom på er, at alle objekter vil blive frigjort af OrganizationServiceContext efter kald til metoden SaveChanges. Hvis du vil fortsætte med at bruge datakonteksten mod tidligere hentede objekter, skal objekterne tilknyttes igen. Dette kan opnås ved igen at forespørge på et nyt sæt af objekter eller ved eksplicit at kalde metoden Attach i objekterne. Developer Extensions for Microsoft Dynamics CRM 2015 leverer en ReAttach-metode, der sikrer, at objekterne er i den korrekte tilstand, når de tilknyttes igen. Dette vises i følgende eksempel.
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();
}
Den foretrukne indstilling er at anvende alle ændringer under et enkelt kald til SaveChanges og derefter fjerne konteksten for at undgå tilknytning igen.
CrmOrganizationServiceContext forenkler dette scenario ved automatisk at tilknytte objekter igen efter kald til SaveChanges. Bemærk, at kun de objekter, der bruges som inputparametre for en AddObject- eller UpdateObject-handling er markeret med flag med henblik på tilknytning igen.
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();
}
Flere datakontekster
Et andet scenarie, der kræver omhyggelig styring af objektsporing, er, når flere datakontekster skal håndtere et fælles enhedsobjekt. Et eksempel er, når én kontekst skal hente et objekt, og en anden kontekst skal opdatere objektet. Før objektet kan ændres af den anden kontekst, skal det være knyttet til den. Fordi et objekt kan kun knyttes til en enkelt kontekst, er det nødvendigt at fjerne tilknytningen mellem objektet og kildekonteksten, før du tilknytter den anden kontekst.
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();
}
}
Fjern et objekt fra konteksten
Nogle gange er det uhensigtsmæssigt at fjerne objektet fra den oprindelige kontekst, fordi det allerede kan være involveret i en kompleks graf over ændringer, der ville blive ødelagt, hvis det blev fjernet. En sikrere metode er, at den anden kontekst blot igen henter en bestemt forekomst af objektet og lader det oprindelige objekt være. En variant af denne fremgangsmåde er at dybdeklone det oprindelige objekt og knytte det klonede objekt til den anden kontekst. Hjælpemetoderne AttachClone<T> og MergeClone<T> bruger den sidstnævnte fremgangsmåde, hvor MergeClone<T> udfører ekstra kontrol for at sikre, at objektet ikke allerede er knyttet til målkonteksten.
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();
}
}
Se også
Attach
SaveChanges
AddObject
UpdateObject
Kontekstobjektmodel for udviklerudvidelser (Dynamics CRM 2015)
Konfigurere konteksten med konfigurationsfilen (Dynamics CRM 2015)
Adgang til objektrelationer (Dynamics CRM 2015)
© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret