Dynamics CRM Linq更新多个记录

Dynamics CRM Linq更新多个记录,linq,dynamics-crm,Linq,Dynamics Crm,正在尝试更新事件记录列表。foreach中的第一个更新,下一个抛出异常,声明“上下文当前未跟踪事件实体”。这是正确的编码方式吗 var openCases = (from o in xrmContext.IncidentSet where o.StateCode == 0 select o).Take(5).ToList(); foreach (var c in openCases)

正在尝试更新事件记录列表。foreach中的第一个更新,下一个抛出异常,声明“上下文当前未跟踪事件实体”。这是正确的编码方式吗

var openCases = (from o in xrmContext.IncidentSet
                    where o.StateCode == 0
                    select o).Take(5).ToList();

                foreach (var c in openCases)
                {   
                    var numDays = ((TimeSpan) (DateTime.Now - c.CreatedOn)).Days;
                    Console.WriteLine("case age: {0},  case number:{1}", numDays, c.TicketNumber);
                    c.new_caseage = numDays;
                    xrmContext.UpdateObject(c);
                    xrmContext.SaveChanges();
                }

调用
SaveChanges()
it时,除了保存任何修改的实体记录外,还会分离上下文中跟踪的所有实体记录。因此,第二次调用
SaveChanges()
时,实体记录未被跟踪,您收到错误

您应该移动
xrmContext.SaveChanges()行位于
foreach
循环之后

           var openCases = (from o in xrmContext.IncidentSet
           where o.StateCode == 0
           select o).Take(5).ToList();

            foreach (var c in openCases)
            {   
                var numDays = ((TimeSpan) (DateTime.Now - c.CreatedOn)).Days;
                Console.WriteLine("case age: {0},  case number:{1}", numDays, c.TicketNumber);
                c.new_caseage = numDays;
                xrmContext.UpdateObject(c);
            }
            xrmContext.SaveChanges();

调用SaveChanges方法后,OrganizationServiceContext将分离所有实体。要继续对以前检索到的实体使用数据上下文,需要重新附着这些实体

但是,首选方法是在单个调用下应用所有修改以保存更改,然后处置上下文,以避免重新附加


更好的方法是使用消息,它可以配置每次迭代(内部迭代)要处理多少条记录

希望能有帮助

var openCases = (from o in xrmContext.IncidentSet
                    where o.StateCode == 0
                    select o).Take(5).ToList();

var requestWithResults = new ExecuteMultipleRequest()
    {
        // Assign settings that define execution behavior: continue on error, return responses. 
        Settings = new ExecuteMultipleSettings()
        {
            ContinueOnError = false,
            ReturnResponses = true
        },
        // Create an empty organization request collection.
        Requests = new OrganizationRequestCollection()
    };

    foreach (var c in openCases)
    {   
        var numDays = ((TimeSpan) (DateTime.Now - c.CreatedOn)).Days;
        c.new_caseage = numDays;

        CreateRequest createRequest = new CreateRequest { Target = c };
        requestWithResults.Requests.Add(createRequest);
    }

  ExecuteMultipleResponse responseWithResults =
  (ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);