Freigeben über


Anhängen von Entitäten an den Kontext (Dynamics CRM 2015)

 

Veröffentlicht: November 2016

Gilt für: Dynamics CRM 2015

Damit OrganizationServiceContext die Änderungen an Entitäten und Beziehungen ordnungsgemäß nachverfolgt, müssen die Entitäten und Beziehungen an den Datenkontext angefügt werden. Wenn Sie sich an das typische Muster zum Abfragen für Entitäten, Aktualisieren der Entitäten und Speichern der Änderungen halten, ist es nicht erforderlich, das Anfügen und Trennen der Entitäten explizit festzulegen. Das bedeutet, Entitäten werden automatisch an den Kontext angefügt, wenn sie abgerufen werden. Dabei ist zu berücksichtigen, dass alle Entitäten von OrganizationServiceContext getrennt werden, nachdem die SaveChanges-Methode aufgerufen wird. Damit der Datenkontext weiterhin für zuvor abgerufene Entitäten verwendet werden kann, müssen die Entitäten erneut angefügt werden. Dies kann erreicht werden, indem ein neuer Satz von Entitäten erneut abgerufen wird, oder indem die Attach-Methode für die Entitäten aufgerufen wird. Entwicklererweiterungen für Microsoft Dynamics CRM 2015 bieten eine ReAttach-Methode, die sicherstellt, dass die Entitäten den richtigen Status haben, wenn sie erneut angefügt werden. Dies wird im folgenden Beispiel veranschaulicht.

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();
}

Die bevorzugte Vorgehensweise besteht darin, alle Änderungen mit einem einzelnen Aufruf von SaveChanges vorzunehmen und dann den Kontext zu entfernen, um die Entitäten nicht erneut anfügen zu müssen.

CrmOrganizationServiceContext vereinfacht dieses Szenario, indem Entitäten automatisch erneut angefügt werden, nachdem SaveChanges aufgerufen wird. Beachten Sie, dass nur die Entitäten, die als Eingabeparameter eines AddObject- oder UpdateObject-Vorgangs verwendet werden, für ein erneutes Anfügen gekennzeichnet werden.

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();
}

Mehrere Datenkontexte

Ein anderes Szenario, das die sorgfältige Verwaltung der Entitätsnachverfolgung erfordert, besteht darin, dass mehrere Datenkontexte ein gemeinsames Entitätsobjekt handhaben. Beispielsweise kann ein Kontext eine Entität abrufen und ein zweiter Kontext die Entität aktualisieren. Bevor die Entität vom zweiten Kontext geändert werden kann, muss sie an ihn angefügt werden. Da eine Entität nur an einen einzelnen Kontext angefügt sein kann, ist es erforderlich, die Entität vom Quellkontext zu trennen, bevor sie an den zweiten Kontext angefügt wird.

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();
}
}

Trennen einer Entität vom Kontext

Manchmal ist es unerwünscht, die Entität vom ursprünglichen Kontext zu trennen, weil sie möglicherweise bereits in einem komplexen Diagramm mit Änderungen enthalten ist, die bei einer Trennung ungültig werden würden. Eine sicherere Methode besteht im erneuten Abrufen einer eindeutigen Instanz der Entität durch den zweiten Kontext, wobei die ursprüngliche Entität unverändert bleibt. Eine Variation dieses Ansatzes ist das tiefe Klonen der ursprünglichen Entität und das Anfügen der geklonten Entität an den zweiten Kontext. Die AttachClone<T>- und MergeClone<T>-Hilfsmethoden verwenden letztere Vorgehensweise, wobei MergeClone<T> weitere Tests durchführt, um sicherzustellen, dass die Entität nicht bereits an den Zielkontext angefügt ist.

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();
}
}

Siehe auch

Attach
SaveChanges
AddObject
UpdateObject
Objektmodell für den Kontext von Entwicklererweiterungen (Dynamics CRM 2015)
Den Kontext der Konfigurationsdatei konfigurieren (Dynamics CRM 2015)
Zugreifen auf Entitätsbeziehungen (Dynamics CRM 2015)

© 2017 Microsoft. Alle Rechte vorbehalten. Copyright