Action方法仅更新1个表MVC

时间:2016-12-07 19:52:36

标签: c# asp.net-mvc asp.net-mvc-5

我是新手,还在学习asp.net MVC。我已经创建了一种发送操作方法,该方法通过根据帐号和足够的资金将金额从用户发送到另一个用户。我的程序工作得很好,但每当我尝试从一个帐户汇款到另一个帐户时,更新只适用于Transactions表,并且CheckingAccounts表上没有更新,应该从余额中扣除 - 如果是转帐 - 或加入其中按要求!我在动作方法中遗漏了什么吗?为什么没有更新aCheckingAccounts表中的余额?任何帮助将非常感激!

汇款行动方法

 [HttpGet]
    public ActionResult MoneyTransfer(int checkAccountId)
    {
        return View();
    }
    [HttpPost]
    public ActionResult MoneyTransfer(Transfers transfer)
    {
      var checkingFunds = DB.checkAccounts.Find(transfer.CheckAccountId); 
        if (checkingFunds.Balance < transfer.Amount)
        {
            ModelState.AddModelError("Amount", "You do not have enough money!");
        }

        var checkingExistedAccount = DB.checkAccounts.Where(account => account.AccountNumber == transfer.checkingExistedAccount).FirstOrDefault();
        if (checkingExistedAccount == null)
        {
            ModelState.AddModelError("checkingExistedAccount", "Account does not exist!");
        }


        if (ModelState.IsValid)
        {
            //Transaction transaction = new Transaction();
            //transaction.TransactionDate = DateTime.Now;       
            DB.Transactions.Add(new Transaction { CheckAccountId = transfer.CheckAccountId, Amount = -transfer.Amount });
            DB.Transactions.Add(new Transaction { CheckAccountId = checkingExistedAccount.Id, Amount = transfer.Amount });
            DB.SaveChanges();
            return RedirectToAction("Index","Home");


        }

        return View();
    }

转移模式

 public class Transfers
    {
        [Required]
        [DataType(DataType.Currency)]
        public decimal Amount { get; set; }
        [Required]
        public int CheckAccountId { get; set; }
        [Required]
        [Display(Name ="Recipient Account ID ")]
        public string checkingExistedAccount { get; set; }
    }

CheckingAccount模型

     public class CheckingAccount
    {
        public int Id { get; set; }

        [Display(Name = "Account Number: ")]
        public string AccountNumber { get; set; }
        [Display(Name = "Balance: ")]
        [DataType(DataType.Currency)]
        public decimal Balance { get; set; }
    }

交易模型

 public class Transaction
    {
        public int Id { get; set; }

        [Required]
        [DataType(DataType.Currency)]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public decimal Amount { get; set; }
        [Required]
        public int CheckAccountId {get; set;}
        public DateTime? TransactionDate { get; set; }
        public virtual CheckingAccount checkAccount { get; set; }
    } 

更新:激活TransactionDate属性会引发异常错误

  

无法将值NULL插入到'TransactionDate'列表中   'ASPNET-dbo.Transactions';列不允许空值。更新失败。   该声明已被终止

2 个答案:

答案 0 :(得分:1)

  

&#34;无法将值NULL插入列&#39; TransactionDate&#39;,table&#39; aspnet-dbo.Transactions&#39 ;;列不允许空值。更新失败。声明已经终止&#34;

这是你的问题。您没有在要添加到数据库的新TransactionDate记录上设置Transaction。即使您的模型将其作为可为空的DateTime,也必须将表本身定义为不可为空。

        DB.Transactions.Add(new Transaction
        {
            CheckAccountId = transfer.CheckAccountId,
            Amount = -transfer.Amount,
            TransactionDate = DateTime.Now
        });
        DB.Transactions.Add(new Transaction
        {
             CheckAccountId = checkingExistedAccount.Id,
             Amount = transfer.Amount,
             TransactionDate = DateTime.Now
        });

如果您希望两个事务具有完全相同的时间戳,则改为使用变量:

        var transactionDate = DateTime.Now;
        DB.Transactions.Add(new Transaction
        {
            CheckAccountId = transfer.CheckAccountId,
            Amount = -transfer.Amount,
            TransactionDate = transactionDate
        });
        DB.Transactions.Add(new Transaction
        {
             CheckAccountId = checkingExistedAccount.Id,
             Amount = transfer.Amount,
             TransactionDate = transactionDate
        });

至于为什么它没有更新其他表,我没有看到你问题中的任何代码实际上是这样做的。在写回记录之前,您需要检索支票帐户记录并更新余额。

答案 1 :(得分:1)

错误表示数据库中的TransactionDate列不允许空值。

在Transaction类中,您可以更改public DateTime? TransactionDate { get; set; } 至:public DateTime TransactionDate { get; set; }因此您需要在添加交易时设置日期。