Обновление LINQ CRM 2011 - Создать - PullRequest
1 голос
/ 27 мая 2011

Я заметил, что модератор CRM Дэвид Дженнауэй на техническом форуме заявляет, что вы не можете использовать LINQ для обновления / создания записей в CRM 2011, см. Здесь http://social.microsoft.com/Forums/en-IE/crmdevelopment/thread/682a7be2-1c07-497e-8f58-cea55c298062

Но я видел несколько тем, которыесделать так, как будто это должно работать.Вот моя попытка, которая не работает.Есть идеи почему бы и нет?

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
OrganizationServiceContext orgContext = new OrganizationServiceContext(service);

EntityState state = new EntityState();
state = EntityState.Changed;

var counter = from c in orgContext.CreateQuery<pcx_entitycounter>()
        where c.pcx_name.Contains("pcx_candidate")
        select new pcx_entitycounter
        {Id = c.Id,
        pcx_name = c.pcx_name, pcx_Sequence = c.pcx_Sequence, pcx_Prefix = c.pcx_Prefix

        };

foreach (var c in counter)
        {
            string prefix = c.pcx_Prefix.ToString(); ;
            string sequence = c.pcx_Sequence.ToString();

            c.pcx_Sequence = c.pcx_Sequence + 1;
            c.EntityState = state;
            **service.Update(c);**  //FAILS HERE

        }

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

По моему опыту, было трудно или невозможно извлечь сущность из контекста, обновить ее, а затем использовать службу для сохранения изменений.Это вызвало у меня головную боль, когда я понял это!

Поскольку ваш поисковый код использует запрос из контекста, все эти объекты должны быть присоединены к контексту, а их состояния отслеживаются.Таким образом, вам необходимо использовать метод контекста для обновления:

foreach (var c in counter) {
    string prefix = c.pcx_Prefix.ToString(); ;
    string sequence = c.pcx_Sequence.ToString();

    c.pcx_Sequence = c.pcx_Sequence + 1;

    // Use the Context to save changes
    orgContext.UpdateObject(c);
    orgContext.SaveChanges();
}

Поскольку большая часть моего кода будет извлекать сущности различными способами (например, Service или Context) в зависимости от ситуации, я разработал простой метод,знает, как правильно обновить сущность.Чтобы расширить ваш пример, у вас может быть метод обновления, который выглядит следующим образом:

public void UpdatePcxEntityCounter(pcx_entitycounter c) {
    if (!orgContext.IsAttached(c)) {
        service.Update(c);
    }
    else {
        orgContext.UpdateObject(c);
        orgContext.SaveChanges();
    }
}

Это предполагает, что и orgContext, и service доступны в области действия, превышающей область метода.В противном случае они должны были бы быть переданы в качестве дополнительных параметров.

0 голосов
/ 05 июня 2011

Не видя трудностей, трудно понять, в чем проблема, но пытались ли вы использовать orgContext.UpdateObject (c);перед выполнением шага обновления?Кроме того, не уверен, почему вы назначаете префикс и последовательность локальным переменным в вашем цикле, так как они, кажется, не используются.Возможно, вы получаете исключение SOAP или что-то для назначения значений, которые не работают.У вас есть какие-либо плагины, зарегистрированные на объекте?

См. Следующие ссылки для возможных решений -

Как обновить объект CRM 2011, используя LINQ в плагине?

http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/7ae89b3b-6eca-4876-9513-042739fa432a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...