将实体附加到上下文 (Dynamics CRM 2015)

 

发布日期: 2016年11月

适用于: Dynamics CRM 2015

为使 OrganizationServiceContext 正确跟踪它对实体和关系所做的更改,需要将实体和关系附加到数据上下文。 在按照典型模式查询实体,更新实体和保存更改时,不需要明确控制实体的附加和分离。 即,在检索实体时,实体会自动附加到上下文。 要注意的一个行为是,在调用 SaveChanges 方法后,OrganizationServiceContext 将会分离所有实体。 若要针对以前检索的实体继续使用数据上下文,需要重新附加这些实体。 通过重新查询一组新实体或对这些实体明确调用 Attach 方法,可以实现此目的。Microsoft Dynamics CRM 2015 的开发人员扩展提供了 ReAttach 方法,该方法确保当重新附加时实体处于正确的状态。 如下例所示。

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

首选方法是将单次调用下的所有修改应用到 SaveChanges,然后释放上下文,以避免重新附加。

CrmOrganizationServiceContext 通过在调用 SaveChanges 后自动附加实体,简化了这种情况。 请注意,只有用作 AddObjectUpdateObject 操作的输入参数的实体才会标记为要重新附加。

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

多个数据上下文

需要仔细管理实体跟踪的另一种情形是使多个数据上下文处理一个通用实体对象。 例如,让一个上下文检索实体,让另一个上下文更新该实体。 在另一个上下文可以修改该实体之前,需要将其附加到该上下文。 因为实体只能附加到单个上下文,所以需要将该实体从源上下文分离,然后再附加到第二个上下文。

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

将实体从上下文分离

有时,不适合从原始上下文分离实体,因为它可能已牵涉到复杂的变化曲线图中,如果分离,将会破坏曲线图改。 一种较为安全的方法是让第二个上下文重新检索该实体的不同实例,而保持原始实体不变。 该方法的一种变化形式是深层克隆原始实体并将克隆的实体附加到第二个上下文。AttachClone<T>MergeClone<T> 帮助程序方法采用后一种方法,即 MergeClone<T> 执行额外检查以确保实体尚未附加到目标上下文。

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

另请参阅

Attach
SaveChanges
AddObject
UpdateObject
开发人员扩展上下文对象模型 (Dynamics CRM 2015)
使用配置文件配置上下文 (Dynamics CRM 2015)
访问实体关系 (Dynamics CRM 2015)

© 2017 Microsoft。 保留所有权利。 版权