0

エンティティの既存の日付を現在の日付と比較しようとしています。エンティティ (testentity) の日付のエンティティ フィールド (testfield) が現在の日付以降の OR に等しい場合、フィールドの日付に 1 年を追加します。

問題- 何らかの理由で、すべての日付を読み取り、比較も行いますが、フィールドで更新しません。エンティティで操作後のステップを使用しました。

更新: ServiceContext.UpdateObject(entity) と ServiceContext.SaveChanges(); を追加しました。コードに追加しましたが、「コンテキストは現在追跡されていません...」というエラーが表示されます。

どんな助けでも大歓迎です。ありがとう!

次のコードを見てください。

   public class PostUpdate: Plugin
{

    public PostUpdate()
        : base(typeof(PostUpdate))
    {
        base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Update", "new_testentity", new Action<LocalPluginContext>(ExecutePostUpdate)));

      protected void ExecutePostupdate(LocalPluginContext localContext)
    {
        // get the plugin context 
        IPluginExecutionContext context = localContext.PluginExecutionContext;

        //Get the IOrganizationService
        IOrganizationService service = localContext.OrganizationService;

        //create the service context
        var ServiceContext = new OrganizationServiceContext(service);
        ITracingService tracingService = localContext.TracingService;

        // The InputParameters collection contains all the data passed in the message request.
        if (context.InputParameters.Contains("Target") &&
        context.InputParameters["Target"] is Entity)
        {
            // Obtain the target entity from the input parmameters.
            Entity entity = (Entity)context.InputParameters["Target"];


            // Verify that the target entity represents an account.
            // If not, this plug-in was not registered correctly.
            if (entity.LogicalName != "new_testentity")
                return;

                    try
                    {
                        var k = entity["new_testfield"];
                        DateTime m = Convert.ToDateTime(k);

                        DateTime d = DateTime.Now;

                        int result = DateTime.Compare(m, d);

                        // compare the dates 
                        if (result <= 0)
                        {
                            try
                            {


                                entity["new_testfield"] = DateTime.Now.AddYears(1);
                                ServiceContext.UpdateObject(entity);
                            }
                        ServiceContext.SaveChanges();
                  //Adding this is giving me "The context is not currently tracking                    the 'new_testentity' entity."

                            }
                            catch (FaultException<OrganizationServiceFault> ex)
                            {
                            }
                        }
                    }

                    //<snippetFollowupPlugin3>
                    catch (FaultException<OrganizationServiceFault> ex)
                    {
                        throw new InvalidPluginExecutionException("An error occurred in the FollupupPlugin plug-in.", ex);
                    }
                    //</snippetFollowupPlugin3>

                    catch (Exception ex)
                    {
                        tracingService.Trace("FollowupPlugin: {0}", ex.ToString());
                        throw;
                    }
            }
        }
4

2 に答える 2

3

操作前のステップでプラグインを登録してから、InputParameterPropertyBag に適切な値を追加/変更するだけです。そうすれば、変更はトランザクションとインラインになり、個別の更新呼び出しは必要ありません。

于 2012-06-13T09:10:13.663 に答える
0

エンティティをserviceContextにアタッチしてみてください。

http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.client.organizationservicecontext.attach.aspx

于 2012-06-12T21:15:44.970 に答える