public virtual void SaveChanges(CustomerOrder[] orders)
        {
            var pkMap          = new PrimaryKeyResolvingMap();
            var changedEntries = new List <GenericChangedEntry <CustomerOrder> >();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository))
                {
                    var dataExistOrders = repository.GetCustomerOrdersByIds(orders.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray(), CustomerOrderResponseGroup.Full);
                    foreach (var modifiedOrder in orders)
                    {
                        EnsureThatAllOperationsHaveNumber(modifiedOrder);
                        LoadOrderDependencies(modifiedOrder);

                        var originalEntity = dataExistOrders.FirstOrDefault(x => x.Id == modifiedOrder.Id);

                        var modifiedEntity = AbstractTypeFactory <CustomerOrderEntity> .TryCreateInstance().FromModel(modifiedOrder, pkMap) as CustomerOrderEntity;

                        if (originalEntity != null)
                        {
                            changeTracker.Attach(originalEntity);

                            var originalOlder = (CustomerOrder)originalEntity.ToModel(AbstractTypeFactory <CustomerOrder> .TryCreateInstance());
                            DynamicPropertyService.LoadDynamicPropertyValues(originalOlder);
                            changedEntries.Add(new GenericChangedEntry <CustomerOrder>(modifiedOrder, originalOlder, EntryState.Modified));

                            modifiedEntity?.Patch(originalEntity);

                            //originalEntity is fully loaded and contains changes from order
                            var newModel = (CustomerOrder)originalEntity.ToModel(AbstractTypeFactory <CustomerOrder> .TryCreateInstance());

                            //newmodel is fully loaded, so we can call CalculateTotals for order
                            TotalsCalculator.CalculateTotals(newModel);
                            //Double convert and patch are required, because of partial order update when some properties are used in totals calculation are missed
                            var newModifiedEntity = AbstractTypeFactory <CustomerOrderEntity> .TryCreateInstance().FromModel(newModel, pkMap) as CustomerOrderEntity;

                            newModifiedEntity?.Patch(originalEntity);
                        }
                        else
                        {
                            TotalsCalculator.CalculateTotals(modifiedOrder);

                            repository.Add(modifiedEntity);
                            changedEntries.Add(new GenericChangedEntry <CustomerOrder>(modifiedOrder, EntryState.Added));
                        }
                    }
                    //Raise domain events
                    EventPublisher.Publish(new OrderChangeEvent(changedEntries));
                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }

            //Save dynamic properties
            foreach (var order in orders)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(order);
            }
            //Raise domain events
            EventPublisher.Publish(new OrderChangedEvent(changedEntries));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Create or update members in database
        /// </summary>
        /// <param name="members"></param>
        public virtual void SaveChanges(Member[] members)
        {
            var pkMap         = new PrimaryKeyResolvingMap();
            var changedEvents = new List <MemberChangedEvent>();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository))
                {
                    var existingMemberEntities = repository.GetMembersByIds(members.Where(m => !m.IsTransient()).Select(m => m.Id).ToArray());

                    foreach (var member in members)
                    {
                        var memberEntityType = AbstractTypeFactory <Member> .AllTypeInfos.Where(t => t.MappedType != null && t.IsAssignableTo(member.MemberType)).Select(t => t.MappedType).FirstOrDefault();

                        if (memberEntityType != null)
                        {
                            var dataSourceMember = AbstractTypeFactory <MemberDataEntity> .TryCreateInstance(memberEntityType.Name);

                            if (dataSourceMember != null)
                            {
                                dataSourceMember.FromModel(member, pkMap);

                                var dataTargetMember = existingMemberEntities.FirstOrDefault(m => m.Id == member.Id);
                                if (dataTargetMember != null)
                                {
                                    changeTracker.Attach(dataTargetMember);
                                    dataSourceMember.Patch(dataTargetMember);
                                    MemberChangingEventPublisher.Publish(new MemberChangingEvent(EntryState.Modified, member));
                                    changedEvents.Add(new MemberChangedEvent(EntryState.Modified, member));
                                }
                                else
                                {
                                    repository.Add(dataSourceMember);
                                    MemberChangingEventPublisher.Publish(new MemberChangingEvent(EntryState.Added, member));
                                    changedEvents.Add(new MemberChangedEvent(EntryState.Added, member));
                                }
                            }
                        }
                    }

                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }

            //Save dynamic properties
            foreach (var member in members)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(member);
            }

            CommerceService.UpsertSeoForObjects(members.OfType <ISeoSupport>().ToArray());

            foreach (var changedEvent in changedEvents)
            {
                MemberChangedEventPublisher.Publish(changedEvent);
            }
        }
        public virtual void SaveChanges(CustomerOrder[] orders)
        {
            var pkMap         = new PrimaryKeyResolvingMap();
            var changedEvents = new List <OrderChangedEvent>();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository))
                {
                    var dataExistOrders = repository.GetCustomerOrdersByIds(orders.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray(), CustomerOrderResponseGroup.Full);
                    foreach (var order in orders)
                    {
                        EnsureThatAllOperationsHaveNumber(order);

                        var originalEntity = dataExistOrders.FirstOrDefault(x => x.Id == order.Id);
                        var originalOrder  = originalEntity != null ? (CustomerOrder)originalEntity.ToModel(AbstractTypeFactory <CustomerOrder> .TryCreateInstance()) : order;

                        //Calculate order totals before event raising
                        TotalsCalculator.CalculateTotals(order);

                        var changingEvent = new OrderChangeEvent(originalEntity == null ? EntryState.Added : EntryState.Modified, originalOrder, order);
                        OrderChangingPublisher.Publish(changingEvent);
                        changedEvents.Add(new OrderChangedEvent(changingEvent.ChangeState, changingEvent.OrigOrder, changingEvent.ModifiedOrder));

                        //Calculate order totals after event raising but before save
                        TotalsCalculator.CalculateTotals(order);

                        var modifiedEntity = AbstractTypeFactory <CustomerOrderEntity> .TryCreateInstance()
                                             .FromModel(order, pkMap) as CustomerOrderEntity;

                        if (originalEntity != null)
                        {
                            changeTracker.Attach(originalEntity);
                            modifiedEntity?.Patch(originalEntity);
                        }
                        else
                        {
                            repository.Add(modifiedEntity);
                        }
                    }

                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }

            //Save dynamic properties
            foreach (var order in orders)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(order);
            }

            //Raise changed events
            foreach (var changedEvent in changedEvents)
            {
                OrderChangedPublisher.Publish(changedEvent);
            }
        }
        public virtual void SaveChanges(CustomerOrder[] orders)
        {
            var pkMap          = new PrimaryKeyResolvingMap();
            var changedEntries = new List <GenericChangedEntry <CustomerOrder> >();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository))
                {
                    var dataExistOrders = repository.GetCustomerOrdersByIds(orders.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray(), CustomerOrderResponseGroup.Full);
                    foreach (var order in orders)
                    {
                        EnsureThatAllOperationsHaveNumber(order);
                        LoadOrderDependencies(order);

                        var originalEntity = dataExistOrders.FirstOrDefault(x => x.Id == order.Id);
                        //Calculate order totals
                        TotalsCalculator.CalculateTotals(order);

                        var modifiedEntity = AbstractTypeFactory <CustomerOrderEntity> .TryCreateInstance()
                                             .FromModel(order, pkMap) as CustomerOrderEntity;

                        if (originalEntity != null)
                        {
                            changeTracker.Attach(originalEntity);
                            var oldEntry = (CustomerOrder)originalEntity.ToModel(AbstractTypeFactory <CustomerOrder> .TryCreateInstance());
                            DynamicPropertyService.LoadDynamicPropertyValues(oldEntry);
                            changedEntries.Add(new GenericChangedEntry <CustomerOrder>(order, oldEntry, EntryState.Modified));
                            modifiedEntity?.Patch(originalEntity);
                        }
                        else
                        {
                            repository.Add(modifiedEntity);
                            changedEntries.Add(new GenericChangedEntry <CustomerOrder>(order, EntryState.Added));
                        }
                    }
                    //Raise domain events
                    EventPublisher.Publish(new OrderChangeEvent(changedEntries));
                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }

            //Save dynamic properties
            foreach (var order in orders)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(order);
            }
            //Raise domain events
            EventPublisher.Publish(new OrderChangedEvent(changedEntries));
        }
        public virtual void SaveChanges(ShoppingCart[] carts)
        {
            var pkMap          = new PrimaryKeyResolvingMap();
            var changedEntries = new List <GenericChangedEntry <ShoppingCart> >();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository))
                {
                    var dataExistCarts = repository.GetShoppingCartsByIds(carts.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray());
                    foreach (var cart in carts)
                    {
                        //Calculate cart totals before save
                        TotalsCalculator.CalculateTotals(cart);

                        var originalEntity = dataExistCarts.FirstOrDefault(x => x.Id == cart.Id);
                        var modifiedEntity = AbstractTypeFactory <ShoppingCartEntity> .TryCreateInstance()
                                             .FromModel(cart, pkMap);

                        if (originalEntity != null)
                        {
                            changeTracker.Attach(originalEntity);
                            var oldEntry = originalEntity.ToModel(AbstractTypeFactory <ShoppingCart> .TryCreateInstance());
                            DynamicPropertyService.LoadDynamicPropertyValues(oldEntry);
                            changedEntries.Add(new GenericChangedEntry <ShoppingCart>(cart, oldEntry, EntryState.Modified));
                            modifiedEntity.Patch(originalEntity);
                        }
                        else
                        {
                            repository.Add(modifiedEntity);
                            changedEntries.Add(new GenericChangedEntry <ShoppingCart>(cart, EntryState.Added));
                        }
                    }

                    //Raise domain events
                    EventPublisher.Publish(new CartChangeEvent(changedEntries));
                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                    EventPublisher.Publish(new CartChangedEvent(changedEntries));
                }

            //Save dynamic properties
            foreach (var cart in carts)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(cart);
            }
        }
        public override void SaveChanges(CustomerOrder[] orders)
        {
            var pkMap = new PrimaryKeyResolvingMap();

            using (var repository = RepositoryFactory())
                using (var changeTracker = GetChangeTracker(repository)) {
                    var dataExistOrders = repository.GetCustomerOrdersByIds(orders.Where(x => !x.IsTransient()).Select(x => x.Id).ToArray(), CustomerOrderResponseGroup.Full);
                    foreach (var order in orders)
                    {
                        EnsureThatAllOperationsHaveNumber(order);

                        var originalEntity = dataExistOrders.FirstOrDefault(x => x.Id == order.Id);
                        var originalOrder  = originalEntity != null ? (CustomerOrder)originalEntity.ToModel(AbstractTypeFactory <CustomerOrder> .TryCreateInstance()) : order;

                        var changeEvent = new OrderChangeEvent(originalEntity == null ? EntryState.Added : EntryState.Modified, originalOrder, order);
                        CustomerOrderEventventPublisher.Publish(changeEvent);

                        var modifiedEntity = AbstractTypeFactory <CustomerOrderEntity> .TryCreateInstance()
                                             .FromModel(order, pkMap) as CustomerOrderEntity;

                        if (originalEntity != null)
                        {
                            changeTracker.Attach(originalEntity);
                            modifiedEntity.Patch(originalEntity);
                        }
                        else
                        {
                            repository.Add(modifiedEntity);
                        }
                    }
                    CommitChanges(repository);
                    pkMap.ResolvePrimaryKeys();
                }
            //Save dynamic properties
            foreach (var order in orders)
            {
                DynamicPropertyService.SaveDynamicPropertyValues(order);
            }
        }