protected override async Task HandleCore(BookingEvent request)
        {
            var projection = new BookingRm()
            {
                BookingId         = request.Booking.Id,
                Rooms             = request.Booking.Rooms,
                ActiveBooking     = request.Booking.BookingStatus == Domain.BookingStatus.Started,
                NumberOfOccupents = request.Booking.NumberOfOccupents,
                DaysBooked        = request.Booking.DaysBooked,
                BookingStartDate  = request.Booking.CheckInDate,
                BookingEndDate    = request.Booking.CheckInDate.AddDays(request.Booking.DaysBooked)
            };

            await this.dao.StoreBooking(projection);
        }
        public async Task StoreBooking(BookingRm booking)
        {
            using (var conn = new SqlConnection(this.connectionString))
            {
                await conn.OpenAsync();

                using (var transaction = conn.BeginTransaction())
                {
                    var deleteSql = "Delete FROM [dbo].[Rm_Bookings] WHERE BookingId = @bookingId; DELETE FROM [dbo].[Rm_BookedRooms] WHERE BookingId = @bookingId";
                    await conn.ExecuteAsync(deleteSql, new { bookingId = booking.BookingId }, transaction);

                    using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction))
                    {
                        bulkCopy.DestinationTableName = "dbo.Rm_BookedRooms";
                        bulkCopy.ColumnMappings.Add("RoomId", "RoomId");
                        bulkCopy.ColumnMappings.Add("BookingId", "BookingId");

                        var table = new DataTable();
                        table.Columns.Add("RoomId");
                        table.Columns.Add("BookingId");

                        foreach (var roomId in booking.Rooms)
                        {
                            var row = table.NewRow();
                            row["RoomId"]    = roomId;
                            row["BookingId"] = booking.BookingId;
                            table.Rows.Add(row);
                        }

                        DataTableReader reader = table.CreateDataReader();
                        await bulkCopy.WriteToServerAsync(reader);

                        var insertBookingSql = @"
                            INSERT INTO [dbo].[Rm_Bookings] (
	                            [BookingId]
                                ,[ActiveBooking]
                                ,[NumberOfOccupents]
                                ,[DaysBooked]
                                ,[BookingStartDate]
                                ,[BookingEndDate])
                            VALUES
                            (
	                            @bookingId,
                                @activeBooking,
                                @numberOfOccupents,
                                @daysBooked,
                                @bookingStartDate,
                                @bookingEndDate
                            )";

                        var sqlParams = new
                        {
                            bookingId         = booking.BookingId,
                            activeBooking     = booking.ActiveBooking,
                            numberOfOccupents = booking.NumberOfOccupents,
                            daysBooked        = booking.DaysBooked,
                            bookingStartDate  = booking.BookingStartDate,
                            bookingEndDate    = booking.BookingEndDate
                        };

                        await conn.ExecuteAsync(insertBookingSql, sqlParams, transaction);
                    }

                    transaction.Commit();
                }
            }
        }