我有一个自定义实体acm_lidmaatschapbedrijf,在创建该实体时必须自动为其生成一个名称,因此用户无需自己执行此操作。
我为此获得了以下课程:
protected class LocalPluginContext
{
internal IOrganizationService OrganizationService
{
get;
private set;
}
internal IPluginExecutionContext PluginExecutionContext
{
get;
private set;
}
internal ITracingService TracingService
{
get;
private set;
}
internal LocalPluginContext(IServiceProvider serviceProvider)
{
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
// Obtain the execution context service from the service provider.
PluginExecutionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// Obtain the tracing service from the service provider.
TracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
Trace("Tracingservice aangemaakt.");
// Obtain the Organization Service factory service from the service provider
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
Trace("Factory aangemaakt");
// Use the factory to generate the Organization Service.
OrganizationService = factory.CreateOrganizationService(PluginExecutionContext.UserId);
Trace("Service aangemaakt");
}
internal void Trace(string message)
{
if (string.IsNullOrWhiteSpace(message) || TracingService == null)
{
return;
}
if (PluginExecutionContext == null)
{
TracingService.Trace(message);
}
else
{
TracingService.Trace(
"{0}, Correlation Id: {1}, Initiating User: {2}",
message,
PluginExecutionContext.CorrelationId,
PluginExecutionContext.InitiatingUserId);
}
}
}
public void Execute(IServiceProvider serviceProvider)
{
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
// Construct the Local plug-in context.
LocalPluginContext localcontext = new LocalPluginContext(serviceProvider);
//Get the entity;
localcontext.Trace("Localcontext aangemaakt");
acm_lidmaatschapbedrijf lidmaatschapbedrijf = ((Entity)localcontext.PluginExecutionContext.InputParameters["Target"]).ToEntity<acm_lidmaatschapbedrijf>();
//Check whether the linked lidmaatschap is the right one;
localcontext.Trace("lidmaatschapbedrijf opghaald");
acm_lidmaatschap lidmaatschapcategorie = localcontext.OrganizationService.Retrieve(acm_lidmaatschap.EntityLogicalName, lidmaatschapbedrijf.acm_typelidmaatschap.Id, new ColumnSet(new[] { "acm_typelidmaatschap" })).ToEntity<acm_lidmaatschap>();
localcontext.Trace("Categorie opgehaald");
localcontext.Trace(string.Format("Categorie = {0}", lidmaatschapcategorie.acm_typelidmaatschap.Value));
if (lidmaatschapcategorie.acm_typelidmaatschap.Value != 805210000)
{
throw new InvalidPluginExecutionException("Het type lidmaatschap is niet bedrijf.");
}
//assign name
lidmaatschapbedrijf["acm_name"] = string.Format("{0} {1}", "Bedrijfslidmaatschap", lidmaatschapbedrijf.acm_account.Name);
localcontext.Trace(string.Format("Nieuwe naam = {0}", lidmaatschapbedrijf.acm_name));
localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;
localcontext.Trace("Target opnieuw toegekend");
}
}
这是插件注册的方式
看起来好像插件已启动,但由于以下错误转储而崩溃:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: System.Runtime.Serialization.SerializationException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #6C7B81E3Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
<ErrorCode>-2147220970</ErrorCode>
<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
<KeyValuePairOfstringanyType>
<d2p1:key>CallStack</d2p1:key>
<d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string"> at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns)
at ReadKeyValuePairOfstringanyTypeFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )
at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns)
at ReadParameterCollectionFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract )
at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
at Microsoft.Crm.Sandbox.SandboxUtility.DeserializeDataContract[T](Byte[] serializedDataContract, Assembly proxyTypesAssembly)
at Microsoft.Crm.Sandbox.SandboxExecutionContext.get_InputParameters()
at Microsoft.Crm.Sandbox.SandboxExecutionContext.Merge(IExecutionContext originalContext)
at Microsoft.Crm.Sandbox.SandboxCodeUnit.Execute(IExecutionContext context)</d2p1:value>
</KeyValuePairOfstringanyType>
</ErrorDetails>
<Message>System.Runtime.Serialization.SerializationException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #6C7B81E3</Message>
<Timestamp>2014-05-09T11:55:16.4261105Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText>
[acm.mscrm.stm.Plugins: acm.mscrm.stm.Plugins.BedrijfsLidmaatschapPreValidator]
[e0ec46f5-f5d5-e311-b055-005056a03018: acm.mscrm.stm.Plugins.BedrijfsLidmaatschapPreValidator: Create of acm_lidmaatschapbedrijf]
</TraceText>
</OrganizationServiceFault>
如您所见,它不显示任何痕迹。它只是崩溃了,我不知道为什么。您是否需要进行任何特殊设置才能使用InputParameters [“ Target”]?
序列化错误来自以下行:
localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;
您不能将早期绑定实体分配给InputParameter [“ Target”]。分配必须是后期绑定的实体,即Entity()
还行吧
Entity lidmaatschapbedrijf = new Entity("new_ lidmaatschapbedrijf")
lidmaatschapbedrijf.acm_name = "constructed name";
localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf;
您也可以这样做...
localcontext.PluginExecutionContext.InputParameters["Target"] = lidmaatschapbedrijf.ToEntity<Entity>();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句