Exemple #1
0
        public void PersistSalesOrderSnapshot(SalesOrderSnapshot salesOrderSnapshot, SalesOrderSnapshot oldSnapshot
                                              , List <Message> messages, TrackerEntitiesContainer tec)
        {
            #region Message references - create them and insert to collection
            foreach (Message message in messages)
            {
                MessageReference reference = new MessageReference()
                {
                    Id = Guid.NewGuid(), MessageId = message.Id, SalesOrderId = salesOrderSnapshot.Id
                };
                salesOrderSnapshot.MessageReferences.Add(reference);
            }
            #endregion

            #region Related Events - delete old events and create ids for new events
            if (oldSnapshot != null)
            {
                while (oldSnapshot.SalesOrderEvents.Count > 0)
                {
                    tec.DeleteObject(oldSnapshot.SalesOrderEvents.Last());
                }
            }
            foreach (SalesOrderEvent newEvent in salesOrderSnapshot.SalesOrderEvents)
            {
                newEvent.Id = Guid.NewGuid();
            }
            #endregion

            #region Set all objects state before saving

            object oldObject     = null;
            string entitySetName = tec.SalesOrderSnapshots.EntitySet.Name;
            tec.TryGetObjectByKey(tec.CreateEntityKey(entitySetName, salesOrderSnapshot), out oldObject);

            if (oldObject == null)
            {
                tec.AddObject(entitySetName, salesOrderSnapshot);                 //all related objects will be also added
            }
            else
            {
                tec.ApplyCurrentValues(entitySetName, salesOrderSnapshot);
                //salesOrderSnapshot remains detached. Status of related objects must be set manualy.
                oldSnapshot = (SalesOrderSnapshot)oldObject;

                while (salesOrderSnapshot.MessageReferences.Count > 0)
                {
                    oldSnapshot.MessageReferences.Add(salesOrderSnapshot.MessageReferences.Last());
                }
                //tec.AddObject(tec.MessageReferences.EntitySet.Name, messageReference);

                while (salesOrderSnapshot.SalesOrderEvents.Count > 0)
                {
                    oldSnapshot.SalesOrderEvents.Add(salesOrderSnapshot.SalesOrderEvents.Last());
                }
                //tec.AddObject(tec.SalesOrderEvents.EntitySet.Name, soEvent);
            }

            #endregion

            tec.SaveChanges();
        }