/// <inheritdoc />
        public Budget CreateBudget(int categoryId, decimal amount, string startDate, string endDate)
        {
            var periodStart = this.validator.DateString(startDate, nameof(startDate));
            var periodEnd   = this.validator.DateString(endDate, nameof(endDate));

            this.validator.Period(periodStart, periodEnd);
            this.validator.Amount(amount);

            return(this.ConcurrentInvoke(() =>
            {
                var category = this.Context.Categories.GetEntity(categoryId, false);

                var entity = new BudgetEntity
                {
                    CategoryId = categoryId,
                    Amount = amount,
                    Spent = Math.Abs(this.Context.Transactions.GetTransactions(categoryId, periodStart, periodEnd).Sum(t => t.Amount)),
                    StartDate = periodStart,
                    EndDate = periodEnd,
                    Category = category,
                };

                this.Context.Budgets.Add(entity);
                this.Context.SaveChanges();

                return entity.AsBudget();
            }));
        }