Цитата:
Сообщение от
maksii
Честно говоря я немного не понимаю вашу оббертку стандартного функционала
Что у вас в bf_PluginProcess, какую энтити используете и тд.
Если вы используете Pre-Image на Pre-Create, то его там нет
На чистом сдк должно работать вот так:
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity yourEntityName= (Entity)context.InputParameters["Target"]
if(yourEntityName.Attributes.Contains("subject"))
yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>["regardingobjectid"].Name;
}
Ошибка у вас из-за того, что на данный момент вызова Update еще не был создан данный рекорд. На пре стейдже не нужно использовать Update, так как на этом этапе еще не произошли манипуляции и транзакции в базу. Вы имитируете добавления поля, как буд-то его добавил пользователь, а не вы.
Довольно таки интерестно, но скажу сразу, я ещё новичок. Создал новый класс.
Вот код:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Bum.Survey.CRM.Plugin.BaseLib;
namespace Bum.Survey.CRM.Plugin
{
public class EvalObjectCreateTest : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
var process = new EvalObjectCreateTestProcess(serviceProvider);
process.LoadEntity();
if (!process.ValidateEntityName("bf_evaluatingobject")) return;
if (!process.ValidateMessage(MessageName.Create, MessageName.Update)) return;
process.Run();
}
}
class EvalObjectCreateTestProcess : bf_PluginProcess
{
public override void Execute()
{
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity yourEntityName = (Entity)context.InputParameters["Target"];
if(yourEntityName.Attributes.Contains("subject"))
yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name;
}
public EvalObjectCreateTestProcess(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
}
}
Само собой пока ничего не работает, кстати, вот содержимое bf_pluginProcess:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace Bum.Survey.CRM.Plugin.BaseLib
{
public static class MessageName
{
public const string Create = "Create";
public const string Update = "Update";
public const string Delete = "Delete";
public const string RetrieveMultiple = "RetrieveMultiple";
public const string Retrieve = "Retrieve";
}
public static class ParameterName
{
public const string Target = "Target";
public const string id = "id";
public const string Query = "Query";
public const string BusinessEntityCollection = "BusinessEntityCollection";
public const string BusinessEntity = "BusinessEntity";
}
public class bf_PluginError : Exception
{
public bf_PluginError(string message)
: base(message)
{
}
}
public abstract class bf_PluginProcess
{
IServiceProvider _serviceProvider;
public IServiceProvider serviceProvider
{
get { return _serviceProvider; }
}
IPluginExecutionContext _executionContext;
public IPluginExecutionContext executionContext
{
get
{
if (_executionContext == null)
_executionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
return _executionContext;
}
}
IOrganizationServiceFactory _serviceFactory;
public IOrganizationServiceFactory serviceFactory
{
get
{
if (_serviceFactory == null)
_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
return _serviceFactory;
}
}
IOrganizationService _crmService;
public IOrganizationService crmService
{
get
{
if (_crmService == null)
_crmService = serviceFactory.CreateOrganizationService(executionContext.UserId);
return _crmService;
}
}
ITracingService _tracingService;
public ITracingService tracingService
{
get
{
if (_tracingService == null)
_tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
return _tracingService;
}
}
public bf_PluginProcess(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
Entity _entity;
public Entity TargetEntity
{
get
{
return _entity;
}
}
EntityReference _entity_key;
public EntityReference TargetKey
{
get { return _entity_key; }
}
public void LoadEntity()
{
if (executionContext.InputParameters.Contains(ParameterName.Target))
{
if (executionContext.InputParameters[ParameterName.Target] is Entity)
{
_entity = (Entity)executionContext.InputParameters[ParameterName.Target];
_entity_key = new EntityReference(_entity.LogicalName, _entity.Id);
}
else if (executionContext.InputParameters[ParameterName.Target] is EntityReference)
{
_entity_key = (EntityReference)executionContext.InputParameters[ParameterName.Target];
}
}
if (executionContext.MessageName == MessageName.Create)
{
if (executionContext.OutputParameters.Contains(ParameterName.id))
_entity_key.Id = (Guid)executionContext.OutputParameters[ParameterName.id];
}
}
public void RequeryTarget()
{
RequeryTarget(new ColumnSet(true));
}
public void RequeryTarget(ColumnSet columnSet)
{
_entity = crmService.Retrieve(TargetKey.LogicalName, TargetKey.Id, columnSet);
}
public bool ValidateEntityName(string logicalName)
{
return _entity_key.LogicalName == logicalName;
}
public bool ValidateMessage(params string[] messages)
{
return messages.Contains(executionContext.MessageName);
}
abstract public void Execute();
public void Run()
{
try
{
Execute();
}
catch (System.Exception ex)
{
throw new InvalidPluginExecutionException(
String.Format("An error occurred in the {0} plug-in: {1}", this.GetType().ToString(), ex.ToString()), ex);
}
}
public Dictionary<int, string> GetOptionSet(string entityName, string optionSetName)
{
RetrieveAttributeRequest req = new RetrieveAttributeRequest();
req.EntityLogicalName = entityName;
req.LogicalName = optionSetName;
RetrieveAttributeResponse res = (RetrieveAttributeResponse)_crmService.Execute(req);
Dictionary<int, string> result = new Dictionary<int, string>();
foreach (var r in ((PicklistAttributeMetadata)res.AttributeMetadata).OptionSet.Options)
{
result.Add(r.Value.Value, r.Label.UserLocalizedLabel.Label);
}
return result;
}
}
public static class DateTimeExt
{
public static string ConvertToCulturalString(this DateTime dt)
{
return dt.ToLocalTime().ToString("dd.MM.yyyy");
}
}
}