Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
ValidationErrors is not reset?
Message
Information générale
Forum:
ASP.NET
Catégorie:
Entity Framework
Versions des environnements
Environment:
VB 9.0
OS:
Windows Server 2012
Network:
Windows 2008 Server
Database:
MS SQL Server
Application:
Web
Divers
Thread ID:
01622996
Message ID:
01623004
Vues:
45
I think you're over-complicating the process. You can call SaveChanges method only once after all processing is done. It will save all the changes at once.

It is probably what it's doing anyway since you opened transaction. So, it's saving all the errors. You can probably explicitly clear that collection if it allows to clear it.

>I'm calling this method for a number of different rows :
>
>
>       private void process()
>        {
>            if (InputBox.confirm("The database will be intialized.")!=System.Windows.Forms.DialogResult.OK) { return; };
>            Monitor.write("Starting Process : Begin Inventory");
>            _interrupt = false;
>            Dispatcher.BeginInvoke(new ThreadStart(() => Statusbar.displayFirstField("Processing...")));
>            using (var xl = new ExcelWrapper()) using (var context = new d060Entities())
>            {
>                var bis = new BeginInventorySource(xl);
>                var tm = new TimeMonitor(2, bis.LastRow);
>                Monitor.write("Lines to process : {0}", bis.LastRow - 1);
>                for  (long r = 2;r<=bis.LastRow;r++)
>                {
>                    if (_interrupt) { return; };
>                    processRow(r, context, bis,tm);
>
>                }
>            }       
>        }
>        void processRow(long r, d060Entities context,BeginInventorySource bis, TimeMonitor tm)
>        {
>            string d020Parcel;
>            string goods;
>            decimal weight;
>            decimal amount;
>            bis.getRow(r, out d020Parcel, out goods, out weight, out amount);
>            var statusMessage = string.Format("Processing... {0} on row {1} {2}", d020Parcel, r, tm.display(r));
>            Dispatcher.BeginInvoke(new ThreadStart(() => Statusbar.displayFirstField(statusMessage)));
>            var parcel = new d060Entity.Parcel();
>            parcel.Cost = amount;
>            parcel.ParcelWeight = weight;
>            parcel.ParcelStatus = d060Entity.Repository.getParcelstatus(d060Entity.Repository.eParcelstatus.Active);
>            parcel.Creationdate = DateTime.Now;
>            parcel.Lastupdatedate = DateTime.Now;
>            parcel.Goods = goods;
>            parcel.D020number = d020Parcel;
>            parcel.D020wrapper = "";
>            // parcel.CalculationStatus = "Locked"; <== missing assignment
>            var transaction = new d060Entity.Transaction();
>            transaction.Creationdate = DateTime.Now;
>            transaction.Lastupdatedate = DateTime.Now;
>            transaction.TransactionDate = new DateTime(2014, 1, 1);
>            transaction.TransactionWeight = weight;
>            transaction.Amount = amount;
>            transaction.Transactiontypes_id = d060Entity.Repository.getTransactiontypes_id(d060Entity.Repository.eTransactiontypes.BeginInventory);
>            transaction.Goods = goods;
>            transaction.D010Transaction = "";
>            transaction.D010Transactiontype = " ";
>            transaction.D020Transaction = "";
>            transaction.D020Transactiontype = " ";
>            var origin = new d060Entity.Origin();
>            origin.Parcels_id = parcel.Parcels_Id;
>            origin.OriginCalculationstatus = "Locked";
>            {
>                using (var t = context.Database.BeginTransaction())
>                {
>                    try
>                    {
>                        string message;
>                        bool success;
>                        context.Parcels.Add(parcel);
>                        Repository.savechanges(context, out success, out message);
>                        if (success == false)
>                        {
>                            Monitor.write("**** Currently processing : {0} **** ", parcel.D020number);
>                            Monitor.write(message);
>                            t.Rollback();
>                            return;
>                        };
>                        transaction.Parcels_Id = parcel.Parcels_Id;
>                        context.Transactions.Add(transaction);
>                        Repository.savechanges(context, out success, out message);
>                        if (success == false)
>                        {
>                            Monitor.write("**** Currently processing : {0} **** ", parcel.D020number);
>                            Monitor.write(message);
>                            t.Rollback();
>                            return;
>                        };
>                        parcel.CreationTransaction_Id = transaction.Transactions_Id;
>                        origin.Parcels_id = parcel.Parcels_Id;
>                        context.Origins.Add(origin);
>                        Repository.savechanges(context, out success, out message);
>                        if (success == false)
>                        {
>                            Monitor.write("**** Currently processing : {0} **** ", parcel.D020number);
>                            Monitor.write(message);
>                            t.Rollback();
>                            return;
>                        };
>                        t.Commit();
>                    }
>                    catch (Exception ex)
>                    {
>                        Monitor.write("Problem with Parcel {0}, line {1} : ", parcel.D020number, r, ex.Message);
>                        t.Rollback();
>                    }
>                }
>            }
>        }
>
>
>>Hmm, never noticed this problem before. Are you calling this method for a number of rows all having the same problem or it's just a single row save and every time it increments?
>>
>>>Right. Sorry.
>>>
>>>Maybe if I show you the result ?
>>>
>>>8/6/2015 4:37:41 PM : **** Currently processing : A$$00100 ****
>>>8/6/2015 4:37:41 PM : DbEntityValidationException.
>>>Errors : 1
>>>The CalculationStatus field is required.
>>>
>>>8/6/2015 4:37:41 PM : **** Currently processing : A$$00124 ****
>>>8/6/2015 4:37:41 PM : DbEntityValidationException.
>>>Errors : 2
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>
>>>8/6/2015 4:37:41 PM : **** Currently processing : A$$00125 ****
>>>8/6/2015 4:37:41 PM : DbEntityValidationException.
>>>Errors : 3
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>
>>>8/6/2015 4:37:41 PM : **** Currently processing : A$$00215 ****
>>>8/6/2015 4:37:41 PM : DbEntityValidationException.
>>>Errors : 4
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>
>>>8/6/2015 4:37:41 PM : **** Currently processing : A$$00344 ****
>>>8/6/2015 4:37:41 PM : DbEntityValidationException.
>>>Errors : 5
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>The CalculationStatus field is required.
>>>
>>>
>>>>>Consider this method:
>>>>>
>>>>>It seems that e.ValidationErrors does not get reset. After multiple catches the previous ierrors remain in the collection.
>>>>>
>>>>>
>>>>>
>>>>>        public static void savechanges(d060Entities context,out bool success,out string message)
>>>>>        {
>>>>>            var s = new StringBuilder();
>>>>>            s.Clear();
>>>>>            success = true;
>>>>>            message = "";
>>>>>            try
>>>>>            {
>>>>>                context.SaveChanges();
>>>>>            }
>>>>>            catch (DbEntityValidationException ex)
>>>>>            {
>>>>>                s.AppendLine("DbEntityValidationException.");
>>>>>                s.AppendFormat("Errors : {0}", ex.EntityValidationErrors.Count());
>>>>>                s.AppendLine();
>>>>>                foreach (var e in ex.EntityValidationErrors)
>>>>>                {
>>>>>                    foreach (var e1 in e.ValidationErrors)
>>>>>                    {
>>>>>                        s.AppendFormat(e1.ErrorMessage);
>>>>>                        s.AppendLine();
>>>>>                    }
>>>>>                }
>>>>>                success = false;
>>>>>                }
>>>>>            catch (Exception ex)
>>>>>            {
>>>>>                s.AppendFormat("error : {0}", ex.ToString());
>>>>>                success = false;
>>>>>            }
>>>>>            message = s.ToString();
>>>>>        }
>>>>>
>>>>
>>>>Your question is unclear. The code seems to be OK, I see no problem.
If it's not broken, fix it until it is.


My Blog
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform