我們決定正確的解決方案是使用在IPluginExecutionContext.InputParameters["Target"]
找到的值。如果是Update
,則返回包含所有已更新屬性的屬性的Entity
。
我們基本上有一個我們關心的屬性名稱列表。我們通過名稱循環查看它們是否出現在實體屬性列表中。如果是這樣,我們會向我們的其他系統發送更新。好消息是,Dynamics CRM會忽略實際上並未更改值的更新,因此嘗試將值更新爲自身是無操作的。
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity entity = (Entity)context.InputParameters["Target"];
string[] fields = new string[] { "name", "statecode", "address1_line1" };
bool hasUpdates = fields.Where(f => entity.Attributes.Contains(f)).Any();
if (!hasUpdates)
{
return;
}
}
我們考慮過每當向服務發送更新時,我們都會設置一個GUID字段。不幸的是,這不適用於'SetState'和'Assign'請求。 –
在這種情況下 - 您應該定義一些用戶帳戶(並且可以使用啓動帳戶調用的插件)。如果通話已完成,則表示該呼叫是從外部系統完成的。 –
和(如果尚未完成)爲每個更新步驟設置過濾屬性。如果外部系統和插件不會更新相同的字段,那麼這應該足夠了。如果他們更新相同的字段,您可以查看上下文深度以防止無限遞歸(我不得不承認)。恕我直言,所有其他選項已由@ andrii-butenko(使用標誌/不同的呼叫用戶) – salyh