Compartilhar via


Anexar entidades ao contexto (Dynamics CRM 2015)

 

Publicado: novembro de 2016

Aplicável a: Dynamics CRM 2015

Para que OrganizationServiceContext acompanhe corretamente suas alterações das entidades e relacionamentos, as entidades e relacionamentos precisam ser anexados ao contexto de dados. Ao seguir o padrão típico de realização de consultas para as entidades, atualização das entidades e salvamento das alterações, não é necessário controlar explicitamente o processo de anexar e desanexar entidades. Ou seja, as entidades são automaticamente anexadas ao contexto quando são recuperadas. Um comportamento é estar ciente de que as entidades são desanexadas por OrganizationServiceContext após chamar o método SaveChanges. Para continuar usando o contexto de dados em entidades anteriormente recuperadas, as entidades devem ser reanexadas. Isso pode ser feito por uma nova consulta a um novo conjunto de entidades ou pela chamada explícita do método Attach nas entidades. As Extensões para Desenvolvedores de Microsoft Dynamics CRM 2015 fornecem um método ReAttach, que garante que as entidades estejam no estado correto quando forem reanexadas. Isto é mostrado no exemplo a seguir.

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

A preferência é aplicar todas as alterações em uma única chamada em SaveChangese descartar o contexto, para evitar a necessidade de reanexar.

O CrmOrganizationServiceContext simplifica este cenário automaticamente reanexando as entidades depois de chamar SaveChanges. Observe que somente as entidades que são usadas como os parâmetros de entrada de uma operação de AddObject ou UpdateObject são sinalizadas para serem reanexadas.

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

Vários contextos de dados

Outro cenário que exige um gerenciamento da cuidadoso do acompanhamento da entidade é fazer com que vários contextos de dados manuseiem um objeto comum da entidade. Um exemplo é fazer um contexto recuperar uma entidade e um segundo contexto atualizá-la. Antes que a entidade possa ser alterada pelo segundo contexto, ela precisa ser anexada a ele. Como uma entidade só pode ser anexada a um único contexto, é necessário desanexar a entidade do contexto de origem antes de anexá-la ao 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();
}
}

Desanexar uma entidade do contexto

Às vezes, é inconveniente desanexar a entidade do contexto original pois ela já pode estar envolvida em um gráfico complexo de alterações que seria desfeito quando ela for desanexada. Uma abordagem mais segura é fazer o segundo contexto simplesmente recuperar uma instância distinta da entidade e deixar a entidade original sem alterações. Uma variação dessa abordagem é clonar a entidade original e anexar a entidade clonada ao segundo contexto. Os métodos auxiliares AttachClone<T> e MergeClone<T> usam a última abordagem, onde MergeClone<T> executa verificações adicionais para garantir que a entidade ainda não esteja anexada ao 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();
}
}

Confira Também

Attach
SaveChanges
AddObject
UpdateObject
Modelo de objeto do contexto das extensões de desenvolvedor (Dynamics CRM 2015)
Configurar o contexto com o arquivo de configuração (Dynamics CRM 2015)
Relacionamentos de entidades de acesso (Dynamics CRM 2015)

© 2017 Microsoft. Todos os direitos reservados. Direitos autorais