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)); }
/// <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); } }