private static void Main()
        {
            var databaseContext = new AtmDbContext();
            databaseContext.CardAccounts.Count();

            var atmTransaction = new AtmTransaction(databaseContext);

            TryTransaction(atmTransaction, 200, "1232124124", "2345");
            TryTransaction(atmTransaction, 200, "1232424124", "2345");
            TryTransaction(atmTransaction, 200, "1232124124", "2325");
            TryTransaction(atmTransaction, 200, "2133142112", "1234");
        }
        public void WithdrawMoney(TransactionRequest transactionRequest)
        {
            using (var transaction = new AtmDbContext().Database.BeginTransaction())
            {
                try
                {
                    if (!this.validator.IsValidCardNumber(transactionRequest.CardNumber))
                    {
                        throw new ArgumentException("Invalid card number. Current transaction is aborted!");
                    }

                    if (!this.validator.IsValidCardPin(transactionRequest.CardPin))
                    {
                        throw new ArgumentException("Invalid Card PIN Code. Current transaction is aborted!");
                    }

                    var cardAccount = this.atmDbContext.CardAccounts
                        .FirstOrDefault(ca => ca.CardNumber == transactionRequest.CardNumber &&
                                              ca.CardPin == transactionRequest.CardPin);
                    if (cardAccount == null)
                    {
                        throw new ArgumentException(
                            "There is no Card account with the given Card number. Current transaction is aborted!");
                    }

                    if (!this.validator.IsPinCodeMatches(transactionRequest.CardPin, cardAccount.CardPin))
                    {
                        throw new ArgumentException(
                            "Chosen Card PIN Code does not matches the actual PIN Code of the card account. Current transaction is aborted!");
                    }

                    if (
                        !this.validator.IsPermittedWithdrawalAmount(transactionRequest.RequestedAmount,
                            cardAccount.CardCash))
                    {
                        throw new ArgumentException(
                            "Invalid withdrawal money amount to retrieve. Current transaction is aborted!");
                    }

                    cardAccount.CardCash -= transactionRequest.RequestedAmount;

                    transaction.Commit();
                    this.atmDbContext.SaveChanges();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    Console.WriteLine("\t" + ex.Message);
                }
            }
        }
 public AtmDbData()
 {
     this.atmDbContext = new AtmDbContext();
     this.validator = new Validator();
 }
 public AtmTransaction(AtmDbContext databesContext)
 {
     this.databesContext = databesContext;
 }