Dynamics crm 2011 CRM插件在异常之前执行操作

Dynamics crm 2011 CRM插件在异常之前执行操作,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我有一个插件,需要创建一组实体,并使用 service.Create(Entity); 在插件结束时(更新前操作,同步),我有时需要取消保存操作。我知道的唯一方法是抛出异常,但如果我这样做,我的service.Create(Entity)不会执行 如何强制服务执行插件内的操作,然后通过抛出异常取消保存 编辑:代码为 var id = service.Create(newEntity); throw new Exception("Cancelled Save but created the ne

我有一个插件,需要创建一组实体,并使用

service.Create(Entity);
在插件结束时(更新前操作,同步),我有时需要取消保存操作。我知道的唯一方法是抛出异常,但如果我这样做,我的service.Create(Entity)不会执行

如何强制服务执行插件内的操作,然后通过抛出异常取消保存

编辑:代码为

var id = service.Create(newEntity);
throw new Exception("Cancelled Save but created the new entity");
如果抛出异常,则不会创建实体。如果我不抛出异常,实体将创建。我需要它来创建并抛出异常,以便取消保存操作


感谢您的指点。

如果
IPluginExecutionContext.IsInTransaction==true
则当抛出异常时,已写入数据库的任何内容都将回滚。您可以尝试在预验证阶段注册,有时在事务之外,但并不总是这样


请注意,不能保证它总是在交易之外。SDK文档非常清楚地说明了这一点,因此随时都可能发生更新,将其放入事务中

:

插件可以在事务的数据库中执行,也可以不在事务的数据库中执行 Microsoft Dynamics CRM平台。插件是否是 事务取决于消息请求的处理方式 管道。您可以检查插件是否正在事务中执行 通过读取继承的IsInTransaction属性 传递给插件的IPluginExecutionContext。如果插件是 在数据库事务中执行,并允许执行异常 传递回平台,整个事务将被滚动 返回阶段20和40保证是数据库的一部分 第10阶段可能是交易的一部分

在数据库事务期间执行的任何已注册插件 然后将异常传递回平台,取消核心 活动这将导致核心操作的回滚。在里面 此外,任何已注册的事件前或事件后插件 尚未执行以及由同一事件触发的任何工作流 为其注册的插件将不会执行


如果
IPluginExecutionContext.IsInTransaction==true
则在引发异常时,将回滚已写入数据库的任何内容。您可以尝试在预验证阶段注册,有时在事务之外,但并不总是这样


请注意,不能保证它总是在交易之外。SDK文档非常清楚地说明了这一点,因此随时都可能发生更新,将其放入事务中

:

插件可以在事务的数据库中执行,也可以不在事务的数据库中执行 Microsoft Dynamics CRM平台。插件是否是 事务取决于消息请求的处理方式 管道。您可以检查插件是否正在事务中执行 通过读取继承的IsInTransaction属性 传递给插件的IPluginExecutionContext。如果插件是 在数据库事务中执行,并允许执行异常 传递回平台,整个事务将被滚动 返回阶段20和40保证是数据库的一部分 第10阶段可能是交易的一部分

在数据库事务期间执行的任何已注册插件 然后将异常传递回平台,取消核心 活动这将导致核心操作的回滚。在里面 此外,任何已注册的事件前或事件后插件 尚未执行以及由同一事件触发的任何工作流 为其注册的插件将不会执行


Nicknow的答案是正确的,但是仍然有一些方法可以实现您想要做的事情

  • 在插件中,不要使用插件上下文中的OrganizationService。创建自己的新OrganizationService,就像创建控制台应用程序一样。此新的OrganizationService不受原始OrganizationService的事务范围的约束

  • 创建一个执行此工作的web服务。从插件中,调用此web服务。web服务不受原始OrganizationService的事务范围的约束

  • 使用ExecuteMultiple。我从未尝试过这个,但有人声称它有效:


  • 希望有帮助

    Nicknow的答案是正确的,但是仍然有一些方法可以实现您想要做的事情

  • 在插件中,不要使用插件上下文中的OrganizationService。创建自己的新OrganizationService,就像创建控制台应用程序一样。此新的OrganizationService不受原始OrganizationService的事务范围的约束

  • 创建一个执行此工作的web服务。从插件中,调用此web服务。web服务不受原始OrganizationService的事务范围的约束

  • 使用ExecuteMultiple。我从未尝试过这个,但有人声称它有效:


  • 希望有帮助

    您是否尝试在更新实体之前执行验证,如果验证失败,则使用
    服务写入错误表(新实体)。创建(实体)
    并通知用户更新操作失败并显示消息?本质上,我创建了一个自定义实体,记录用户试图更改的内容的详细信息,然后禁止保存。我是在插件中这样做的,因为可能有工作流和/或其他服务试图修改记录。如果
    IPluginExecutionContext.IsInTransaction==true
    ,那么如果您抛出异常,您可以