將實體附加至內容 (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 其下單一呼叫的更改,然後除去背景以避免重新依附的需要。

在呼叫 SaveChanges 後,CrmOrganizationServiceContext 透過自動重新依附實體簡化了此案例。 請注意,只有在實體用為 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> Helper 方法接受後者的方式,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. 著作權所有,並保留一切權利。 著作權