0

我是 MVC 的新手,我正在尝试构建一个基本的 Web 应用程序来模拟网上银行的一些功能。到目前为止,我已经能够设置用户帐户并将其与 SimpleMembership 链接,并为帐户管理实现一些简单的 CRUD 功能。

编辑:

我希望转账像下面这样工作,让用户从视图的下拉框中选择 account1 和 account2,然后输入转账金额。我的问题是,在我的特定模型设置下,如果两个帐户总数都在同一类中,是否会这样做?或者最好给每个学生一个 ICollection 帐户?

像这样处理转入和动作结果的逻辑是否正确?还是最好在模型中处理?

我正在尝试做的伪代码

    public ActionResult TransferFunds(int firstAccountId, Int SecondAccountID, decimal transferAmount)
{
    var account1 = //find first account from context
    var account2 = //find second account from context

    if(account1 amount >= transferAmount)
    {
        account1 amount -= transferAmount;
        account2 amount += transferAmount;
    }
    save changes
}

感谢您抽出时间查看此内容并提供帮助。

这是我提到的相关模型。

用户、学生和帐户的模型

    public class User
{
    [Key]
    [Editable(false)]
    [ForeignKey("UserProfile")]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    public virtual UserProfile UserProfile { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name is required.")]
    [MaxLength(50)]
    public virtual string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name is required.")]
    [MaxLength(50)]
    public virtual string LastName { get; set; }
}

学生

    public class Student : User
{
    [ForeignKey("Account")]
    [Editable(false)]
    public virtual int AccountID { get; set; }

    public virtual Account Account { get; set; }

    [Column("ClassroomID")]
    [ForeignKey("Classroom")]
    public virtual int ClassroomID { get; set; }

    public virtual Classroom Classroom { get; set; }
}

银行账户

    public class Account
{
    [Key]
    [Editable(false)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public virtual int AccountID { get; set; }

    [DisplayFormat(DataFormatString = "{0:c}")]
    [Column(TypeName = "money")]
    public virtual decimal CheckingsTotal { get; set; }

    [DisplayFormat(DataFormatString = "{0:c}")]
    [Column(TypeName = "money")]
    public virtual decimal SavingsTotal { get; set; }

    public decimal AccountTotal()
    {
        return SavingsTotal + CheckingsTotal;
    }
4

1 回答 1

1

在我看来,您的问题实际上并不是关于 MVC 或 EF,而是关于类设计和域建模——这是一个非常广泛的主题,所以任何人都很难给你一个好的答案。值得您花时间阅读该主题。

但是,这里有一些提示:

您上面给出的粗略设计可能“有效” - 但它有几个问题。

例如,如果您决定用户需要的不仅仅是“支票”和“储蓄”帐户,您将需要修改Account类和底层数据库。正如您所建议的,用户最好拥有一个 ICollection 帐户。

一般来说,在控制器中使用这种逻辑是个坏主意。控制器动作不应该有太多的逻辑。这种逻辑是模型的基础,所以它应该放在这里。如果控制器中的一个小错误意味着您将钱存入一个帐户而没有从另一个帐户中取出钱,那就太容易了。

还要考虑将资金从一个账户转移到另一个账户并不像从一个账户中减去并添加到另一个账户那么简单——如果第一个账户中没有足够的钱怎么办?如果第二个帐户与第一个帐户不属于同一用户怎么办?如果稍后您决定有可以存款但不能取款的账户怎么办?等等等等

转移资金的逻辑可能会变得相当复杂,并且您不希望在您的控制器中乱扔垃圾 - 最好将所有这些都放在一个地方,您的模型。

你可以考虑一个AccountManager负责做这种事情的人

例如

public class AccountManager
{

    public void TransferMoney(Account srcAccount, Account destAccount, Decimal amount) 
    {
       //...transfer money...
    }

}

并让您的控制器调用此方法来安排传输。

最好你做一些阅读,想出一个设计,然后尝试一下。如果您提出的设计有一些您不喜欢或不确定的特定内容,请在 StackOverflow 上发布特定问题,我相信有人会提供帮助。广泛的一般性问题不太可能得到非常有帮助的回复。

于 2013-06-25T04:10:41.800 回答