public static void WithdrawMoney(AtmDataDbContext context, CardAccount card, decimal amount)
        {
            var transaction = context.Database.BeginTransaction();
            try
            {
                CardAccount targetCard;
                var found = context.CardAccounts.Where(c => c.CardNumber == card.CardNumber && c.CardPIN == card.CardPIN && c.CardCash >= amount);
                if (found.Count() == 0)
                {
                    throw new ApplicationException("Invalid card operation attempt.");
                }

                targetCard = found.First();
                Console.WriteLine("Initial balance: {0}", targetCard.CardCash);
                targetCard.CardCash -= amount;
                context.SaveChanges();
                context.TransactionsHistories.Add(new TransactionsHistory()
                {
                    CardNumber = card.CardNumber,
                    TransactionDate = DateTime.Now,
                    Amount = amount
                });
                context.SaveChanges();
                transaction.Commit();
                Console.WriteLine("Transaction completed successfully.");
                Console.WriteLine("Balance after the transaction: {0}", targetCard.CardCash);
            }
            catch (Exception e)
            {
                Console.WriteLine("Transaction not completed. Changes rolled back.");
                Console.WriteLine(e.Message);
                transaction.Rollback();
            }
        }
 public static void Main()
 {
     var context = new AtmDataDbContext();
     using (context)
     {
         Console.WriteLine("All cards:");
         Console.WriteLine(string.Join(Environment.NewLine, context.CardAccounts.Select(c => new { Card = c.CardNumber, Balance = c.CardCash })));
         try
         {
             var targetCard = new CardAccount() { CardNumber = "1234567892", CardPIN = 3434 };
             WithdrawMoney(context, targetCard, 200m);
             WithdrawMoney(context, targetCard, 2000m);
         }
         catch (Exception e)
         {
             Console.WriteLine(e.Message);
         }
     }
 }