2016-05-17 4 views
1

私のコードはLeadエンティティを更新していないようです。私は新しいLead()を作成しました。あなたがコードで見ることができるように、レコードを保存すると更新がありません。私が間違っていることはありますか?この更新方法は、crmContext.UpdateObject(oLead)を実行して更新するのと同じくらい十分です。 crmContext.SaveChanges();.なぜ誰かがこのリードを更新していないのを助けてくれますか?同じ基本的なプラグインを参照するだけの質問がありますが、作成する代わりに私は更新しています。CRMのリードレコードを更新できません。

 private List<Product> GetSectionAProducts() 
    { 

     List<Product> products = new List<Product>(); 
     var QEproduct = new QueryExpression("product"); 

     // Add all columns to QEproduct.ColumnSet 
     QEproduct.ColumnSet.AllColumns = true; 

     // Define filter QEproduct.Criteria 
     QEproduct.Criteria.AddCondition("productnumber", ConditionOperator.BeginsWith, "MGIP"); 
     var QEproduct_Criteria_0 = new FilterExpression(); 
     QEproduct.Criteria.AddFilter(QEproduct_Criteria_0); 

     // Define filter QEproduct_Criteria_0 
     QEproduct_Criteria_0.AddCondition("capg_billingtimeframe", ConditionOperator.Equal, (int)capg_billingcycletype.Monthly); 
     QEproduct_Criteria_0.AddCondition("capg_mincriteria", ConditionOperator.NotNull); 
     QEproduct_Criteria_0.AddCondition("capg_maxcriteria", ConditionOperator.NotNull); 
     QEproduct_Criteria_0.AddCondition("price", ConditionOperator.NotNull); 

     EntityCollection results = this.OrganizationService.RetrieveMultiple(QEproduct); 
     if (results.Entities != null) 
     { 
      // Retrieve all records from the result set. 
      foreach (Entity product in results.Entities) 
      { 
       products.Add(new Product { Id = product.Id, capg_MinCriteria = (int?)product.Attributes["capg_mincriteria"], capg_MaxCriteria = (int?)product.Attributes["capg_maxcriteria"], Price = (Money)product.Attributes["price"] }); 


      } 
     } 

     return products; 
    }      



       var duesproduct = sectionA.Where(o => o.capg_MinCriteria.Value <= dues).ToList().OrderByDescending(o => o.capg_MaxCriteria).FirstOrDefault(); 
       if (duesproduct != null) 
       { 
        Xrm.Lead oLead = new Lead(); 
        oLead.Id = this.InputTargetEntity.Id; 
        oLead.capg_CalculatedDuesBilling = new Money(duesproduct.Price == null ? 0 : duesproduct.Price.Value); 
        if (duesproduct.capg_MaxCriteria <= 100000) 
        { 
         oLead.capg_CalculatedDuesBilling = new Money(Math.Round((duesproduct.Price == null ? 0 : duesproduct.Price.Value) * new decimal(0.0290), 2)); 

        } 

        if (duesproduct.capg_MaxCriteria <= 235000) 
        { 
         oLead.capg_CalculatedDuesBilling = new Money(Math.Round((duesproduct.Price == null ? 0 : duesproduct.Price.Value) * new decimal(0.0262), 2)); 
        } 

        this.OrganizationService.Update(oLead); 

       } 
+0

oLead.Idに、更新される予定のリードの正しいGUIDが割り当てられているかどうか確認してください。 – Renjith

答えて

2

IOrganizationService.Updateでレコードを直接更新することをお勧めします。コンテキストは更新しないでください。コンテキストは、LINQを使用できるためクエリに便利ですが、コンテキストを介してエンティティを更新すると、選択したすべてのエンティティ属性の更新としてCRMに送信され、予期しないワークフローを引き起こす可能性があるため奇妙な動作が発生する可能性があります。それはまた、本当にすばやく監査履歴を埋めます。

鉛の新しいインスタンスを作成し、それを更新する属性とIDだけで作成し、service.Updateを呼び出す方がはるかに優れています。

+0

私はそれを理解しました。私はIPluginと私自身のクラスを使用しないので、自動的に更新され、this.OrganizationService.Update(olead);プラグインを遅くして更新しないようにしました。 –

+0

また、最初にlinqを使用しましたが、含まれているwhere句に問題がありました。それは非常に実行可能な選択肢ではありませんが、ありがとうございます。 –

+0

LINQにはいくつかの制限がありますが、それを知ってからは簡単ですが、管理しやすい厳密に型指定されたクラスを使用するので便利です。残念ながら、LINQはすべてを行うことはできません。また、独自のExpression Treesをビルドする場合を除いて、QueryExpressionsやFetchXmlを使用する必要があります。 – Jordi

関連する問題