Как обновить объект CRM 2011 с помощью LINQ в плагине?

Мы можем создавать новые объекты без каких-либо проблем, но обновление существующего объекта в плагине, похоже, не работает. Это для CRM 2011.

var crmContext = new CustomCrmContext(service);

var contact = crmContext.Contact.FirstOrDefault(c=>c.Id == targetEntity.Id);

contact.new_CustomField = "Updated";

crmContext.SaveChanges();

person Chad    schedule 22.02.2011    source источник


Ответы (3)


Вы должны пометить объект как измененный, чтобы отправить его на сервер. См. OrganizationServiceContext.UpdateObject (объект)

Вы должны добавить crmContext.UpdateObject(contact); перед crmContext.SaveChanges();

person ccellar    schedule 22.02.2011
comment
‹Message›Неожиданное исключение из подключаемого модуля (Execute): Microsoft.Xrm.Sdk.SaveChangesException: при обработке этого запроса произошла ошибка.‹/Message› - person Chad; 22.02.2011
comment
Выше показано, что я получаю, когда делаю UpdateObject. Опять же, я могу добавить новую запись без каких-либо проблем. Это просто обновление существующего объекта, который, похоже, не работает. Любые идеи? - person Chad; 22.02.2011
comment
Не могли бы вы описать, как вы зарегистрировали свой плагин? Зарегистрирован ли он для обновления контакта? У исключения SaveChangesException есть свойство Results — какие элементы включены? - person ccellar; 30.03.2011
comment
У меня такая же проблема. После того, как я добавил context.UpdateObject(entity) перед context.SaveChanges(), это сработало. - person nang; 19.05.2011
comment
У меня те же результаты, что и у @Chad, есть предложения? - person Marco Medrano; 28.11.2012
comment
@MarcoMedrano проверьте Исключение. Есть ли какой-либо другой плагин, который запускается, или тот же плагин запускается через обновление? - person ccellar; 06.12.2012
comment
Привет @ccellar, В моем случае это ничего не делает, я имею в виду, что я вызываю UpdateObject, а также SaveChanges, но просто ничего не делает. - person Marco Medrano; 07.12.2012
comment
@MarcoMedrano, может быть, было бы лучше, если бы вы могли создать новый вопрос и опубликовать код. - person ccellar; 11.12.2012
comment
@ccellar, вы правы, я бы включил даже сообщения плагина, которые я использую для воспроизведения проблемы. Спасибо :) - person Marco Medrano; 11.12.2012

Нет необходимости загружать всю запись контакта, если у вас уже есть идентификатор, и вам просто нужно обновить одно или два поля. Вам также не нужен OrganizationServiceContext — только Service. Попробуйте что-то вроде:

var c = new contact() {
  Id = targetEntity.Id,
  new_CustomField = "Updated"
}

service.Update(c);

Это сэкономит время на запрос контакта в оба конца.

person Josh Painter    schedule 25.05.2011
comment
Если вы ранее извлекли сущность из OrganizationServiceContext, а затем запросили ее снова. Не будет ли он уже закэширован в контексте, т.е. не будет выполняться круговой обход? - person Cartaya; 09.06.2016

LINQ в порядке, просто создайте новый объект или список и зациклите список в linq и обновите:

using (var crm = new XrmServiceContext(service)){
var foo = crm.nmipcs_productpriceitemSet
    .Where(ppis => ppis.nmipcs_Account.Id == account.Id).ToList();

foreach (var nmipcsProductpriceitem in foo){
    var f = new nmipcs_productpriceitem
    {
    Id = nmipcsProductpriceitem.Id                 
    ,
    nmipcs_PriceSalesChannel = (decimal) 9.99
    };

    service.Update(f);
}
    }
person psven    schedule 22.03.2012