使用 OrganizationServiceContext 类

 

发布日期: 2016年11月

适用于: Dynamics CRM 2015

在 Microsoft Dynamics CRM 2015 和 Microsoft Dynamics CRM Online 2015 更新中,您可使用 OrganizationServiceProxy 类访问 Web 服务。 或者,您也可以使用代码生成工具生成的 OrganizationServiceContext 获取对附加功能的访问权限。OrganizationServiceContext 类允许您跟踪更改,管理标识和关系,并为您提供对 Microsoft Dynamics 365 LINQ 提供程序的访问权限。 该类还包含一个 OrganizationServiceContext.SaveChanges 方法,可使用该方法提交对上下文所跟踪的数据的更改。 该类所基于的概念与 Windows Communication Foundation (WCF) Data Services 中的 DataServiceContext 类的概念相同。

若要生成此类,则在生成早期绑定类型时为 /serviceContextName 参数提供值。 代码生成工具使用此名称作为生成的类名称。 有关如何使用代码生成工具的详细信息,请参阅使用代码生成工具 (CrmSvcUtil.exe) 创建早期绑定实体类。 在开发应用程序、插件和工作流活动时,可以使用组织服务上下文。

本主题内容

如何使用组织服务上下文类

跟踪组织服务上下文的更改

跟踪与组织服务上下文相关的对象

保存组织服务上下文的更改

上下文更改时使用虚拟方法

如何使用组织服务上下文类

若要实例化上下文类,必须将类构造函数传递给实施 IOrganizationService 界面的对象。 一个选项是传递 OrganizationServiceProxy 类的实例。 有关 T:Microsoft.Xrm.Sdk.IorganizationService 界面的详细信息,请参阅使用 IOrganizationService Web 服务读取和写入数据及元数据

以下代码示例显示如何创建新的上下文类实例。 在此示例中,通过使用代码生成工具上的 /serviceContextName 参数来命名上下文类 AdventureWorksCycleServiceContext。

//For early bound types to work correctly, they have to be enabled on the proxy.
_serviceProxy.EnableProxyTypes();
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext(_serviceProxy);

创建组织服务上下文对象之后,可以开始跟踪创建、修改或删除实体。 例如,以下代码示例显示如何实例化新联系人,然后通过使用服务上下文对象将其保存到 Microsoft Dynamics 365 服务器。

//  Create a new contact record;
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext (_serviceProxy);
Contact contact = new Contact() 
 {
   FirstName = "Pamela",
   LastName = "Brown",
   Address1_Line1 = "123 Easy St.",
   Address1_City = "Atlanta",
   Address1_StateOrProvince = "GA",
   Address1_PostalCode = "32254",
   Telephone1 = "425-555-5678"   };
context.AddObject(contact);
context.SaveChanges();

上述代码示例中有几点需要注意。 首先,实例化新联系人之后,要将该联系人对象传递到 OrganizationServiceContext.AddObject 方法,这样,上下文可以开始跟踪该对象。 第二点需要注意的是新对象通过使用 OrganizationServiceContext.SaveChanges 方法保存到服务器。

组织服务上下文必须跟踪要提交到 Microsoft Dynamics 365 的任何实体或关系。 例如,可以使用 LINQ 查询检索记录使上下文跟踪该实体,或者使用 OrganizationServiceContext.Attach 方法使上下文开始跟踪该实体。 您可以使用客户端应用程序中的数据,还可以创建新实体、创建相关实体和修改现有实体,但是必须对跟踪的实体调用 SaveChanges 方法,以便将更改提交到 Microsoft Dynamics 365 服务器。

跟踪组织服务上下文的更改

若要确定上下文如何跟踪实体,可以检查实体实例上的 EntityState 属性。 必须通过调用各种方法或使用 LINQ 查询通知组织服务上下文跟踪 Microsoft Dynamics 365 中的实体。 服务上下文对从 .NET 语言集成查询 (LINQ) 查询返回的所有实体进行跟踪。

可以通过调用 OrganizationServiceContext 中的以下方法之一,将对象添加到服务上下文:

方法

用途

AddObject

将实体添加到组织服务上下文正在跟踪的实体集中。 上下文中的实体状态设置为 Created。 如果调用 SaveChanges 方法,则会创建此记录或将其添加到服务器。

Attach

将实体添加到组织服务上下文正在跟踪的实体集中。 上下文中的实体状态设置为 Unchanged。 如果调用 SaveChanges 方法,则不会将此实体发送到服务器,除非其状态更改。

CreateQuery

将查询的结果添加到组织服务上下文正在跟踪的实体集中。

跟踪与组织服务上下文相关的对象

在 Dynamics 365 和 CRM Online 中,组织服务上下文使您可以创建和更新实体之间的关系。 使用 CrmSvcUtil 工具生成的位于早期绑定的类中的导航属性,您可以访问和更改相关的实体属性和关系。 组织服务上下文必须正在跟踪相关实体,使该相关实体可在服务器上进行更新。

使用 OrganizationServiceContext 中的以下方法,使用相关实体并将实体添加到服务上下文中:

方法

用途

AddRelatedObject

将目标添加到上下文中。 针对目标实体调用 Attach 方法,然后在源实体和目标(相关)实体之间调用 AddLink 方法。

AttachLink

将相关实体添加到上下文中以进行跟踪。 上下文中的实体状态设置为 Unchanged

AddLink

在源实体与目标实体之间创建关系。 将目标添加到上下文中。 上下文中的目标实体状态设置为 Created

LoadProperty

加载为指定关系设置的相关实体。 通过使用导航属性可以访问相关实体。 通过使用父实体上的导航属性可以访问实体之后,针对相关实体调用 AddObject 方法。

UpdateObject

OrganizationServiceContext 中指定实体的状态更改为 Modified。

DeleteObject

更改 OrganizationServiceContext 中要删除的指定实体的状态。

使用导航属性的相关实体进行加载

使用 LINQ 相关实体进行检索为 null,直到使用 LoadProperty 检索他们。 以下代码示例展示了如何访问关联到一个特定的联系记录的任务记录。

Contact pam = context.ContactSet.Where(c => c.FirstName == "Pamela").FirstOrDefault();
if (pam != null)
{
// pam.Contact_Tasks is null until you use LoadProperty
    context.LoadProperty(pam, "Contact_Tasks");
    Task firstTask = pam.Contact_Tasks.FirstOrDefault();
}

保存组织服务上下文的更改

组织服务上下文保留正在跟踪的实体图形。 组织服务上下文处理实体更改并将更改提交至服务器的顺序非常重要。 首先处理主要实体的更新,然后处理相关实体的更新。 如果相关实体在主要实体上设置了值,则在更新服务器上的数据时使用该值。

如果在保存实体信息储时出现错误,则会由 SaveChangesResult.OrganizationServiceContext 方法引发包含 SaveChanges 的新异常类型,这与传递至方法中的 SaveChangesOptions 参数值无关。

上下文更改时使用虚拟方法

有时需要根据 OrganizationServiceContext 中的更改采取措施。 为了完成此操作,提供了虚拟方法使您可以拦截操作或获得操作通知。 若要利用这些方法,则必须从 OrganizationServiceContext 派生,或更改已生成的组织服务上下文。下表列出了虚拟方法。

方法

说明

OnBeginEntityTracking

将实体附加到 OrganizationServiceContext 之后调用。

OnBeginLinkTracking

将链接附加到 OrganizationServiceContext 之后调用。

OnEndEntityTracking

将实体从 OrganizationServiceContext 中分离之后调用。

OnEndLinkTracking

将链接从 OrganizationServiceContext 中分离之后调用。

OnExecuting

要将请求提交到 Microsoft Dynamics CRM 服务器之前立即调用。

OnExecute

将请求提交到 Microsoft Dynamics CRM 服务器 之后立即调用,无论是否发生异常。

OnSavingChanges

调用 SaveChanges 之后,发生任何操作之前调用。

OnSaveChanges

完成调用 SaveChanges 所需的所有操作时或出现故障时调用。

另请参阅

T:Microsoft.Xrm.Sdk.IorganizationService
OrganizationServiceContext
在代码中使用早期绑定实体类
示例:复杂的 LINQ 查询
使用代码生成工具 (CrmSvcUtil.exe) 创建早期绑定实体类
使用早期绑定的实体类进行创建、更新和删除

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