Beispiel #1
0
        public async Task CreateCoffeeRoastingEvent(CoffeeRoastingEvent @event, CancellationToken cancellationToken)
        {
            await using var db = _dbContextFactory.Create();

            await db.CoffeeRoastingEvents.AddAsync(@event, cancellationToken);

            foreach (var contact in @event.Contacts)
            {
                db.Entry(contact).State = EntityState.Modified;
            }

            await db.SaveChangesAsync(cancellationToken);
        }
Beispiel #2
0
        public async Task UpdateCoffeeRoastingEvent(CoffeeRoastingEvent @event, CancellationToken cancellationToken)
        {
            await using var db = _dbContextFactory.Create();

            db.CoffeeRoastingEvents.Update(@event);

            var existingEvent = await db.CoffeeRoastingEvents
                                .Where(ev => ev.Id == @event.Id)
                                .Include(ev => ev.Orders)
                                .ThenInclude(o => o.OrderCoffees)
                                .Include(ev => ev.CoffeeRoastingEventCoffees)
                                .Include(ev => ev.Contacts)
                                .SingleAsync(cancellationToken);

            var existingContactIds = existingEvent.Contacts.Select(c => c.Id);

            foreach (var existingContact in @event.Contacts.Where(c => existingContactIds.Contains(c.Id)))
            {
                db.Entry(existingContact).State = EntityState.Unchanged;
            }

            var existingOrderIds = existingEvent.Orders.Select(o => o.Id).ToArray();

            foreach (var existingOrder in @event.Orders.Where(o => existingOrderIds.Contains(o.Id)))
            {
                db.Entry(existingOrder).State         = EntityState.Modified;
                db.Entry(existingOrder.Invoice).State = EntityState.Modified;
            }

            foreach (var newOrder in @event.Orders.Where(o => !existingOrderIds.Contains(o.Id)))
            {
                db.Entry(newOrder).State         = EntityState.Added;
                db.Entry(newOrder.Invoice).State = EntityState.Added;
            }

            foreach (var deletedOrder in existingEvent.Orders.Where(existingOrder => [email protected](o => o.Id).Contains(existingOrder.Id)))
            {
                db.Entry(deletedOrder).State         = EntityState.Deleted;
                db.Entry(deletedOrder.Invoice).State = EntityState.Deleted;
            }

            db.RemoveRange(existingEvent.CoffeeRoastingEventCoffees);
            db.RemoveRange(existingEvent.Orders.SelectMany(o => o.OrderCoffees));

            await db.AddRangeAsync(@event.CoffeeRoastingEventCoffees, cancellationToken);

            await db.AddRangeAsync(@event.Orders.SelectMany(o => o.OrderCoffees), cancellationToken);


            await db.SaveChangesAsync(cancellationToken);
        }
Beispiel #3
0
        public async Task <CoffeeRoastingEvent> Save(CoffeeRoastingEvent @event, CancellationToken cancellationToken)
        {
            var dbEvent = await _mapper.Map(@event, cancellationToken);

            if (await _dataLayer.DoesCoffeeRoastingEventExist(@event.Id, cancellationToken))
            {
                await _dataLayer.UpdateCoffeeRoastingEvent(dbEvent, cancellationToken);
            }
            else
            {
                await _dataLayer.CreateCoffeeRoastingEvent(dbEvent, cancellationToken);
            }

            var createdOrUpdatedEvent = await _dataLayer.GetCoffeeRoastingEvent(@event.Id, cancellationToken);

            return(_mapper.Map(createdOrUpdatedEvent));
        }