I've created a Workflow that inserts members to Marketing list. But when the process is completed, I notice that the marketing list members counter is always = N -1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using System.Activities;
using System.IO;
namespace ContactToMarketingList
{
public class ContactToMList : CodeActivity
{
[RequiredArgument]
[Input("Contatto")]
[ReferenceTarget("contact")]
public InArgument<EntityReference> Contact { get; set; }
[RequiredArgument]
[Input("Marketing List")]
[ReferenceTarget("list")]
public InArgument<EntityReference> MList { get; set; }
[RequiredArgument]
[Input("Inserimento")]
public InArgument<bool> Inserimento { get; set; }
private static string _separatore = "\r\n";
private static Log_Entity log = null;
protected override void Execute(CodeActivityContext executionContext)
{
//Entity myList = new Entity();
//myList.LogicalName = "list";
string _logs = string.Empty;
//string fileName = "c:\\temp\\" + DateTime.Now.ToString("HH:mm:ss.ffff");
//if (!File.Exists(fileName))
// File.WriteAllText(fileName, string.Empty);
IExecutionContext context = executionContext.GetExtension<IExecutionContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
ITracingService tracer = executionContext.GetExtension<ITracingService>();
if(log== null)
log = new Log_Entity(service);
try
{
EntityReference contactiId = Contact.Get<EntityReference>(executionContext);
log.addLogs(ref _logs, "ContactiId:::" + contactiId.Id.ToString());
EntityReference listId = MList.Get<EntityReference>(executionContext);
log.addLogs(ref _logs, "ListId:::" + listId.Id.ToString());
Boolean inserimento = Inserimento.Get(executionContext);
log.addLogs(ref _logs, "Boolean:::" + inserimento.ToString().ToUpper());
XrmDataContext datacontext = new XrmDataContext(service);
var members = (from m in datacontext.ListMemberSet where m.ListId.Id == MList.Get<EntityReference>(executionContext).Id select m.EntityId.Id).ToArray();
Boolean _action = false;
foreach (Guid id in members)
if (Contact.Get<EntityReference>(executionContext).Id == id)
_action = true;
log.addLogs(ref _logs, "L'utente è già nella lista?" + _action.ToString().ToUpper());
if (Inserimento.Get(executionContext) && !_action)
{
log.addLogs(ref _logs, "Add to marketing List - Inizio");
// File.AppendAllText(fileName, "Inserimento.Get(executionContext) && !_action");
AddMemberListRequest AddMemberRequest = new AddMemberListRequest();
AddMemberRequest.ListId = MList.Get<EntityReference>(executionContext).Id;
AddMemberRequest.EntityId = Contact.Get<EntityReference>(executionContext).Id;
AddMemberListResponse AddMemberResponse = service.Execute(AddMemberRequest) as AddMemberListResponse;
log.addLogs(ref _logs, "Add to marketing List - Fine");
}
else if (!Inserimento.Get(executionContext) && _action)
{
log.addLogs(ref _logs, "Remove from marketing List - Inizio");
RemoveMemberListRequest RemoveMemberRequest = new RemoveMemberListRequest();
RemoveMemberRequest.ListId = MList.Get<EntityReference>(executionContext).Id;
RemoveMemberRequest.EntityId = Contact.Get<EntityReference>(executionContext).Id;
RemoveMemberListResponse RemoveMemberResponse = service.Execute(RemoveMemberRequest) as RemoveMemberListResponse;
log.addLogs(ref _logs, "Remove from marketing List - Fine");
}
else
{
log.addLogs(ref _logs, Inserimento.Get(executionContext) == true ? "L'utente è già presente nella Lista di Marketing." + _separatore : "L'utente non è presente nella Lista di Marketing." + _separatore);
}
log.WriteLog( _logs);
var MyList = (from l in datacontext.ListSet where l.Id == listId.Id select l).ToList().FirstOrDefault();
service.Update(MyList);
}
catch(Exception ex)
{
if (log == null)
new Log_Entity(service).WriteLog( _logs, ex.Message);
else
log.WriteLog( _logs, ex.Message);
}
}
}
}
In my logs, every time I call Service.Update() I found the message :
EntityState must be set to null, Created (for Create message) or Changed (for Update message)