"Target" 什么时候可以代替实体,我应该在处理单个实体类型时检查它的逻辑名称吗?

What and when can "Target" be instead of an Entity and should I check its logical name when working on a single entity type?

我是 CRM 开发的新手,所以我想弄清楚一些事情。你首先需要知道你必须做某事的原因才能完全理解它。那么让我们进入问题吧。

我知道你在制作插件时必须这样做:

var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters.Contains("Target") && context.InputParameters.["Target"] is Entity)
{
     var entity = (Entity)context.InputParameters["Target"];
     if(entity.LogicalName == "myEntity")
     {
         //Do something with your entity
     }
}

现在,在插件注册工具中,您可以设置您的插件将在定义的消息上触发,以及哪些实体(以及它们的特定属性)将受其影响,以及其他内容。

我可以看到验证在使用单个插件操作多个实体时非常有用。

现在,假设您只使用插件更新单个实体。为什么我应该检查 "Target" 上的实体是否是我想要处理的实体,如果我已经知道,因为我特别为那个实体设置了它?在那种情况下实体可以是什么?

此外,在什么情况下 "Target" 不是实体(在当前上下文中)?

在此先感谢,如果这是一个愚蠢的问题,我们深表歉意。

看到这个答案:Is Target always an Entity or can it be EntityReference?

根据 SDK (https://msdn.microsoft.com/en-us/library/gg309673.aspx):

Note that not all requests contain a Target property that is of type Entity, so you have to look at each request or response. For example, DeleteRequest has a Target property, but its type is EntityReference.

最重要的是,您需要查看其中有许多派生类型 (https://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.organizationrequest.aspx) 的请求(所有插件都在 OrganizationRequest 上触发)以确定 Target 属性.

正如 Nicknow 所说,Input Parameters 将根据正在执行的消息而变化。

您可以从 MSDN 获取该信息(每个请求都会在“属性”部分下列出输入参数,例如 CreateRequest) or using the ParameterBrowser

还有一个非常好的替代方法可以在以下博客文章中描述的类型安全方法(包括智能感知)来处理此问题:mktange's blog.