nevas
nevas

Reputation: 81

Concurrency Exception

I'm the only user using the system and this code throws a concurrency exception all I'm trying to do is update the status and add the user who is adopting the task

OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.

     namespace GoldMine.View.Notification.Home.Process {
   using PageInstruction = GraphiteGTC.Core.View.Element.Model.PageInstruction;
    using Notification = GoldMine.Model.Notification;
    using User = GoldMine.Model.User;
    using NotificationApprovalStatus = GoldMine.Model.NotificationApprovalStatus;
    using ButtonTypeOption = GoldMine.Model.ButtonTypeOption;

    /// <summary>
    ///
    /// Class housing the logic for OnClickAdoptApproveTaskButtonProcess
    ///
    /// </summary>
    public class OnClickAdoptApproveTaskButtonProcess : GoldMineViewProcess {
        /// <summary>
        ///
        /// View process inputs
        ///
        /// </summary>
        public new OnClickAdoptApproveTaskButtonProcessInputs Inputs {
            get { return ( OnClickAdoptApproveTaskButtonProcessInputs )base.Inputs; }
            set { base.Inputs = value; }
        }

        /// <summary>
        ///
        /// View process outputs
        ///
        /// </summary>
        public new OnClickAdoptApproveTaskButtonProcessOutputs Outputs {
            get { return ( OnClickAdoptApproveTaskButtonProcessOutputs )base.Outputs; }
            set { base.Outputs = value; }
        }

        /// <summary>
        ///
        /// UI outputs
        ///
        /// </summary>
        public OnClickAdoptApproveTaskButtonProcessUiOutputs UiOutputs {
            get { return new OnClickAdoptApproveTaskButtonProcessUiOutputs( Outputs ); }
        }

        /// <summary>
        ///
        /// Default parameter-less constructor
        ///
        /// </summary>
        public OnClickAdoptApproveTaskButtonProcess() {
            Name = "GoldMine.View.Notification.Home.Process.OnClickAdoptApproveTaskButtonProcess";
            Inputs = new OnClickAdoptApproveTaskButtonProcessInputs();
            Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();
            base.Outputs = Outputs;
            base.Inputs = Inputs;
            DelayedPropertyAssignments = new List<DelayedPropertyAssignment>();
        }

        /// <summary>
        ///
        /// Entry point for event processing
        ///
        /// </summary>
        protected override GraphiteGTCProcess ExecuteProcess( GTCEventRegistration executingEventRegistration ) {
            return base.ExecuteProcess( Inputs.EventRegistration );
        }

        /// <summary>
        ///
        /// Entry point for Business Logic Processing
        ///
        /// </summary>
        protected override GraphiteGTCProcess ExecuteForwardProcessing() {
            try {
                Outputs = new OnClickAdoptApproveTaskButtonProcessOutputs();

                Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
                Debugging.DebugWorker.Current.BeginProcess();
                Debugging.DebugWorker.Current.SetVariableValue( "ButtonType", Inputs.ButtonType );
                Debugging.DebugWorker.Current.SetVariableValue( "CurrentNotification", Inputs.CurrentNotification );
                Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );
                Debugging.DebugWorker.Current.SetVariableValue( "CurrentUser", Inputs.CurrentUser );
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "092c84bf-423e-454b-8efa-00749bc691ef" );

                // ShapeComment:[Create List of Page Instructions][b60bbb93-3a06-4a57-ace3-6024f91c94a0][4bf395e3-e0a1-4304-b987-dcdae594a524]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "4bf395e3-e0a1-4304-b987-dcdae594a524" );
                Outputs.PageInstructions = new List<PageInstruction>();
                Debugging.DebugWorker.Current.SetVariableValue( "PageInstructions", Outputs.PageInstructions );

                // ShapeComment:[Get Receiver][b60bbb93-3a06-4a57-ace3-6024f91c94a0][6b9c89cc-79c7-4957-8164-9a0c25da7652]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "6b9c89cc-79c7-4957-8164-9a0c25da7652" );
                #region Execute FindReceiverFromNotification Process

                var notificationFindReceiverFromNotificationProcess = new Notification( true ).FindReceiverFromNotificationProcess;
                notificationFindReceiverFromNotificationProcess.Inputs.EventRegistration = Inputs.EventRegistration;
                notificationFindReceiverFromNotificationProcess.Inputs.CurreuntUser = Inputs.CurrentUser;
                notificationFindReceiverFromNotificationProcess.Inputs.Notification = Inputs.CurrentNotification;
                notificationFindReceiverFromNotificationProcess.OverriddenValidations = OverriddenValidations;
                try {
                    notificationFindReceiverFromNotificationProcess.StartProcessing();
                    Outputs.Validations.AddRange( notificationFindReceiverFromNotificationProcess.Outputs.Validations );
                }
                catch ( ValidationResultException validationResultException ) {
                    Outputs.Validations.AddRange( validationResultException.Validations );
                    if ( validationResultException.ContainsError() ) {
                        throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
                    }
                }

                #endregion
                var NotificationFindReceiverFromNotificationResult = notificationFindReceiverFromNotificationProcess;
                Debugging.DebugWorker.Current.SetVariableValue( "NotificationFindReceiverFromNotificationResult", NotificationFindReceiverFromNotificationResult );

                // ShapeComment:[Assign Notification as Read][b60bbb93-3a06-4a57-ace3-6024f91c94a0][324e353c-cdd6-488e-8c9c-3420051a06f5]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "324e353c-cdd6-488e-8c9c-3420051a06f5" );
                Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
                Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;

                // ShapeComment:[Save Notification][b60bbb93-3a06-4a57-ace3-6024f91c94a0][c407dd77-b074-4c26-ac9b-557d73fec312]
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "c407dd77-b074-4c26-ac9b-557d73fec312" );
                GoldMine.View.Notification.Home.Process.SaveNotificationProcess SaveNotificationProcessResult = null;
                try {
                    SaveNotificationProcessResult = ( GoldMine.View.Notification.Home.Process.SaveNotificationProcess ) EventProcess.ExecuteUnregisteredViewEvent( "GoldMine.View.Notification.Home.Process.SaveNotificationProcess", Inputs.CurrentUser, new NameValuePairInputCollection {
                        { "Notification", Inputs.CurrentNotification }
                    } );
                    Outputs.Validations.AddRange( SaveNotificationProcessResult.Outputs.Validations );
                }
                catch ( ValidationResultException validationResultException ) {
                    Outputs.Validations.AddRange( validationResultException.Validations );
                    if ( validationResultException.ContainsError() ) {
                        throw new ValidationResultException( string.Format( "Processing {0} resulted in an error", Name ), Outputs.Validations );
                    }
                }
                var HomeSaveNotificationResult = SaveNotificationProcessResult;
                Debugging.DebugWorker.Current.SetVariableValue( "HomeSaveNotificationResult", HomeSaveNotificationResult );
                Debugging.DebugWorker.Current.BeginInstruction( "b60bbb93-3a06-4a57-ace3-6024f91c94a0", "85d667f2-7ed7-4d91-9dff-1c25687fa197" );
                Debugging.DebugWorker.Current.EndProcess();
                Outputs.SessionToken = UiStringConverter.CreateSessionToken( Inputs.CurrentUser );
                return this;
            }
            *catch ( ConcurrencyException ) {
                throw;*
            }

Upvotes: 0

Views: 357

Answers (1)

Gabriel Luci
Gabriel Luci

Reputation: 40858

Notice this in the exception message:

affected an unexpected number of rows (0)

That basically means "I thought I was going to change something, but I ended up changing nothing".

This can happen with a query like UPDATE MyTable SET MyColumn = "hi" WHERE Id = 5, but there is no record with an Id of 5.

If the exception is being thrown on one of these two lines:

Inputs.CurrentNotification.AdoptedBy = Inputs.CurrentUser;
Inputs.CurrentNotification.ApprovalStatus = NotificationApprovalStatus.Approved;

that means that the setter methods of those properties are writing to the database. The property definition would look something like this:

User AdoptedBy {
    get {
         //something here
    }
    set {
        //this is writing to the database
    }
}

And for some reason it is updating something that doesn't exist. But we can't tell you why or how to solve it without seeing that code.

So it depends on the class definition for whatever type Inputs.CurrentNotification is. If it is one of your classes, then you probably just debug and step through that code.

Really, it is not a good idea to do any kind of I/O operations in property getter/setters.

Upvotes: 2

Related Questions