2014-10-11 83 views
0

试图更新事件记录列表。在foreach中的第一个更新中,下一个抛出一个异常,指出“上下文当前没有跟踪事件实体”。这是对此进行编码的正确方法吗?Dynamics CRM Linq更新多条记录

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

回答

1

当你调用SaveChanges()它,除了保存任何修改的实体记录,在分离的背景下正在跟踪的所有实体记录。因此,第二次您拨打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(); 
0

一种更好的方式做你尝试做的是使用消息ExecuteMultipleRequest,它可以配置多少纪录为每一个迭代过程(内部迭代)

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

希望它有帮助