注册为“后操作”的 Dynamics CRM 插件是在数据库事务内部还是外部运行?

Dyl*_*tie 5 dynamics-crm dynamics-crm-online dynamics-crm-2015

我正在为 Dynamics CRM(2015 和 CRM Online)的自定义 C# 插件注册插件。

当您使用 Visual Studio CRM Explorer 创建新插件时,您会看到标准的“创建插件”对话框:

在此处输入图片说明

在“管道阶段”下,有三个选项:

  1. 预验证
  2. 操作前
  3. 术后

选择Post-Operation此处会将此代码添加到 XML 注册文件中:

    <Plugin Description="..." FriendlyName="PostContactCreate" Name="Cacheron.PostContactCreate" Id="00000000-0000-0000-0000-000000000000" TypeName="Cacheron.PostContactCreate">
      <Steps>
        <clear />
        <Step CustomConfiguration="" Name="PostContactCreate" Description="Post-Operation of Contact Create" Id="00000000-0000-0000-0000-000000000000" MessageName="Create" Mode="Synchronous" PrimaryEntityName="contact" Rank="1" SecureConfiguration="" Stage="PostOutsideTransaction" SupportedDeployment="ServerOnly">
          <Images />
        </Step>
      </Steps>
    </Plugin>
Run Code Online (Sandbox Code Playgroud)

关键部分是那条中间线,它说 Stage="PostOutsideTransaction"

该工具生成的相应 C# 代码包括以下行:

base.RegisteredEvents.Add(
  new Tuple<int, string, string, Action<LocalPluginContext>>(
    40, 
    "Create", 
    "contact", 
    new Action<LocalPluginContext>(ExecutePostContactCreate)
  )
);
Run Code Online (Sandbox Code Playgroud)

插件注册中的神奇数字 40 似乎对应于https://msdn.microsoft.com/en-gb/library/gg327941.aspx 中记录的“管道阶段” ,它说

事后

术后

40

在主要操作之后执行的插件的管道中的阶段。在此阶段注册的插件在数据库事务中执行。

所以我得到了由明确说明PostOutsideTransaction的工具生成的注册 XML ,以及由指定阶段 40 的同一工具生成的 C# 代码,它是“在数据库事务中执行”

那么它是哪个?XML 注册语法是否使用了误导性名称,或者这是插件创建工具中的错误,还是执行管道在做一些我不理解的聪明事情?

Hen*_*jen 3

这取决于您的操作后插件步骤注册的消息。对于最常见的消息,该步骤在数据库事务内执行:

  • Create
  • Update
  • Delete
  • SetState
  • Assign

一些其他消息可以在数据库事务之外执行,例如PublishPublishAll,而对于其他消息则有所不同(Retrieve, RetrieveMultiple)。

IPluginExecutionContext对象中您可以检查IsInTransaction属性。