我是新手,还在学习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';列不允许空值。更新失败。 该声明已被终止
答案 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; }
因此您需要在添加交易时设置日期。