1

下面是我用来在 CRM 2011 在线创建联系人的代码。它没有抛出任何错误,但也没有创建任何联系。我已经在电子邮件实体的操作后创建事件上注册了插件。我不知道我是否遗漏了什么。任何帮助将不胜感激。

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());
            }

        }
    }
}
4

3 回答 3

2

我可以看到您缺少一个声明,即:

oContext.AddObject(contact);
oContext.SaveChanges(); // <= Saves the changes
于 2012-04-12T13:24:37.923 回答
0

它确实解决了问题,但现在又抛出了另一个错误:

未处理的异常:System.ServiceModel.FaultException`1 [[Microsoft.Xrm.Sdk.OrganizationServiceFault,Microsoft.Xrm.Sdk,版本=5.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35]]:插件出现意外异常(执行):Microsoft.Crm.Sdk.Samples.RegistrationPlugin:System.Exception:Microsoft.Xrm.Sdk.SaveChangesException:处理此请求时发生错误。---> System.TypeLoadException:覆盖成员时违反了继承安全规则:“Microsoft.Crm.Services.Utility.DeviceRegistrationFailedException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)”。重写方法的安全可访问性必须与被重写方法的安全可访问性相匹配。在 System.Reflection.RuntimeAssembly。

在我看来,这是一个权利问题。你能建议我现在缺少什么吗?

更新:我通过添加 OwnerID = new EntityReference("systemuser", context.UserId) 解决了这个问题

于 2012-04-13T10:04:11.597 回答
0

嗯,我认为您不需要填写 ID 字段,因为当您创建它时,CRM 会向您发送 ID。

不知道它是否可以帮助您,因为我没有创建联系人而是创建事件。但我认为过程是一样的。所以我让你看看。

私人 Guid createCase(IOrganizationService CrmService,实体电子邮件)

    {
        ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
        tracingService.Trace("Just to tracing my plugin");

/* CREATE AN 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"];

/* 结尾 */

        tracingService.Trace("tracing 2.");

/* 在这里您可以在 CRM 中创建记录 */

        Guid caseid = CrmService.Create(incident);

/* 结尾 */

        tracingService.Trace("tracing 3. ID: "+ caseid.ToString());

        return caseid;
    }
于 2013-07-02T14:58:06.223 回答