Показать сообщение отдельно
Старый 03.04.2014, 15:41   #5  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от 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");
        }
    }
}