以下是我用于在线创建CRM 2011联系人的代码。它没有抛出任何错误,但它也没有创建任何联系。我已经在电子邮件实体的Post-Operation创建事件中注册了该插件。我不知道我是否遗漏了什么。任何帮助将是欣赏。
public class RegistrationPlugin : IPlugin
{
private OrganizationServiceContext oContext;
public void Execute(IServiceProvider serviceProvider)
{
Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
oContext = new OrganizationServiceContext(service);
//service.EnableProxyTypes();
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
try
{
Entity entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName == "email")
{
Guid _contactId;
var contact = new Contact()
{
FirstName = "Mary Kay",
LastName = "Andersen",
Address1_Line1 = "23 Market St.",
Address1_City = "Sammamish",
Address1_StateOrProvince = "MT",
Address1_PostalCode = "99999",
Telephone1 = "12345678",
EMailAddress1 = "marykay@contoso.com",
Id = Guid.NewGuid()
};
_contactId = contact.Id;
oContext.AddObject(contact);
}
}
catch (Exception x)
{
throw new Exception(x.ToString() + "\n" + x.InnerException.ToString());
}
}
}
}
答案 0 :(得分:2)
我可以看到你错过了一个声明:
oContext.AddObject(contact);
oContext.SaveChanges(); // <= Saves the changes
答案 1 :(得分:0)
它确实解决了问题,但它现在又引发了另一个错误:
未处理的异常:System.ServiceModel.FaultException`1 [[Microsoft.Xrm.Sdk.OrganizationServiceFault,Microsoft.Xrm.Sdk,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35]]:来自插件的意外异常in(Execute):Microsoft.Crm.Sdk.Samples.RegistrationPlugin:System.Exception:Microsoft.Xrm.Sdk.SaveChangesException:处理此请求时发生错误。 ---&GT; System.TypeLoadException:覆盖成员时违反了继承安全规则:'Microsoft.Crm.Services.Utility.DeviceRegistrationFailedException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'。覆盖方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配。 在System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly程序集,ObjectHandleOnStack retTypes) 在System.Reflection.RuntimeAssembly.GetExportedTypes() 在Microsoft.Xrm.Sdk.KnownProxyTypesProvider.LoadKnownTypes(程序集程序集) 在Microsoft.Xrm.Sdk.KnownProxyTypesProvider.RegisterAssembly(程序集程序集) 在Microsoft.Xrm.Sdk.AssemblyBasedKnownProxyTypesProvider.GetTypeForName(String name,Assembly proxyTypesAssembly) 在..................
在我看来,这是一个权利问题。你能告诉我现在缺少什么吗?
更新:我通过添加OwnerID = new EntityReference(“systemuser”,context.UserId)来解决问题
答案 2 :(得分:0)
不知道它是否可以帮到你,因为我不创建联系人而是事件。但我认为这个过程是一样的。所以我让你看看。
私人Guid createCase(IOrganizationService CrmService,Entity email)
{
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
tracingService.Trace("Just to tracing my plugin");
/ *创建一个ENTITY:事件在这里,但可以是联系人,帐户,... * /
Entity incident = new Entity("incident");
incident["title"] = email.Attributes["subject"].ToString();
incident["caseorigincode"] = new OptionSetValue(2);
EntityCollection ec = email.Attributes["from"] as EntityCollection;
Entity from = ec.Entities.FirstOrDefault();
incident["customerid"] = (EntityReference)from.Attributes["partyid"];
/ * END * /
tracingService.Trace("tracing 2.");
/ *在此创建CRM中的记录* /
Guid caseid = CrmService.Create(incident);
/ * END * /
tracingService.Trace("tracing 3. ID: "+ caseid.ToString());
return caseid;
}