Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Publicado: noviembre de 2016
Se aplica a: Dynamics CRM 2015
Para que OrganizationServiceContext siga correctamente los cambios en las entidades y las relaciones, es necesario asociarlas al contexto de datos. Cuando realiza el seguimiento del patrón típico de consulta para entidades, de actualización de entidades, y de almacenamiento de cambios, no es necesario controlar de forma explícita la asociación y desasociación de entidades. Es decir, las entidades se incorporan automáticamente en el contexto cuando se recuperan. Un comportamiento que debe tenerse en cuenta es que OrganizationServiceContext desasocia todas las entidades luego de llamar al método de SaveChanges . Para continuar con el contexto de los datos frente a las entidades recuperadas anteriormente, las entidades deben volver a asociarse. Esto puede lograrse al volver a consultar un nuevo grupo de entidades o al llamar explícitamente al método de Attach en las entidades. Las extensiones de desarrollador para Microsoft Dynamics CRM 2015 ofrecen un método de ReAttach que garantiza que las entidades se encuentren en el estado correcto cuando se vuelven a asociar. Esto se muestra en el siguiente ejemplo.
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 preferencia es aplicar todas las modificaciones bajo una sola llamada a SaveChanges y, a continuación, eliminar el contexto, para evitar la necesidad de volver a asociar.
El CrmOrganizationServiceContext simplifica este escenario al volver a asociar automáticamente las entidades después de llamar a SaveChanges. Tenga en cuenta que solo las entidades que se usan como parámetros de entrada de una operación de AddObject o de UpdateObject están marcadas para volver a asociarse.
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();
}
Varios contextos de datos
Otro escenario que requiere la administración cuidadosa del seguimiento de una entidad es tener varios contextos de datos que manejan un objeto de entidad en común. Un ejemplo es que un contexto recupere una entidad y que un contexto secundario la actualice. Es necesario asociar la entidad al segundo contexto antes de que pueda ser modificada. Puesto que una entidad puede estar asociada a un solo contexto, es necesario desasociar la entidad del contexto de origen antes de asociarlo al segundo contexto.
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();
}
}
Desasociar una entidad de un contexto
Algunas veces no se desea desasociar una entidad del contexto original porque es posible que ya esté involucrada en un gráfico complejo de cambios que podría romperse al desasociarse. Un enfoque más seguro es que el contexto secundario simplemente vuelva a recuperar una instancia diferente de la entidad y deje la entidad original sin tocar. Una variación de este enfoque es clonar la entidad original en profundidad y asociar la entidad clonada al contexto secundario. Los métodos de las aplicaciones auxiliares AttachClone<T> y MergeClone<T> toman el último enfoque, donde MergeClone<T> realiza las pruebas adicionales para garantizar que la entidad ya no está asociada al contexto de destino.
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();
}
}
Ver también
Attach
SaveChanges
AddObject
UpdateObject
Modelo de objetos de contexto de extensiones de desarrollador (Dynamics CRM 2015)
Configurar el contexto con el archivo de configuración (Dynamics CRM 2015)
Acceder a relaciones entre entidades (Dynamics CRM 2015)
© 2017 Microsoft. Todos los derechos reservados. Copyright