首页 > 解决方案 > 使用 ASP.NET Core MVC 将多行插入数据库

问题描述

我有一个个人 ASP.NET Core MVC 项目。在我的旧网站上有一个表单,我使用存储过程,然后使用代码隐藏(VB.Net)我可以将两条记录插入同一个表中。

我目前正在努力将整个转换为 ASP.NET Core MVC。我发现整个 CRUD 过程相当简单,但遇到了一个问题。我想使用一种形式插入两行数据。我有两个表 -帐户资金(FK AccountId)。我想要表格将资金从一个帐户转移到另一个帐户。所以一行数据应该是

AccountId =1, Description ="Transfer", Date=05/06/2020, PaymentType=Transfer Out

接着

AccountId =2, Description ="Transfer", Date=05/06/2020, PaymentType=Transfer In

我想我已经整理了视图,但我坚持使用 Post 的代码。我可能可以让它做一张唱片,但我怎么做两张呢?

这是我到目前为止所尝试的:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("FromAccountId,ToAccountId,Date,Amount")] TransferViewModel fund)
        {
            if (ModelState.IsValid)
            {
                Fund saveFund = new Fund();
                _db.Attach(saveFund);
                saveFund.AccountId = fund.FromAccountId ;
                saveFund.Description = "Transfer out";
                saveFund.Date = fund.Date;
                saveFund.Amount = fund.Amount;
                saveFund.PaymentTypeId = 4;
                saveFund.CreatedBy = User.Identity.Name.ToString();
                saveFund.CreatedDate = DateTime.Now;
                await _db.SaveChangesAsync();
                {
                    saveFund.AccountId = fund.ToAccountId;
                    saveFund.Description = "Transfer in";
                    saveFund.Date = fund.Date;
                    saveFund.Amount = fund.Amount;
                    saveFund.PaymentTypeId = 8;
                    saveFund.CreatedBy = User.Identity.Name.ToString();
                    saveFund.CreatedDate = DateTime.Now;
                    await _db.SaveChangesAsync();
                }
                return RedirectToAction(nameof(Index));
            }
            ViewData["FromAccountId"] = new SelectList(_db.Account, "AccountId", "Name");
            ViewData["ToAccountId"] = new SelectList(_db.Account, "AccountId", "Name");
            return View(fund);
        }

这似乎拥有所有数据,但只保存最后一条记录。我添加了一个简单的视图模型,以便可以将 ToAccountId 与 FromAccountId 分开。

好的,我想我已经解决了:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("FromAccountId,ToAccountId,Date,Amount")] TransferViewModel fund)
    {
        if (ModelState.IsValid)

            {
            Fund saveFund1 = new Fund();
                _db.Attach(saveFund1);
            {
                saveFund1.AccountId = fund.FromAccountId;
                saveFund1.Description = "Transfer out";
                saveFund1.Date = fund.Date;
                saveFund1.Amount = fund.Amount;
                saveFund1.PaymentTypeId = 4;
                saveFund1.CreatedBy = User.Identity.Name.ToString();
                saveFund1.CreatedDate = DateTime.Now;
            }
            Fund saveFund2 = new Fund();
                _db.Attach(saveFund2);
            {

                saveFund2.AccountId = fund.ToAccountId;
                saveFund2.Description = "Transfer in";
                saveFund2.Date = fund.Date;
                saveFund2.Amount = fund.Amount;
                saveFund2.PaymentTypeId = 8;
                saveFund2.CreatedBy = User.Identity.Name.ToString();
                saveFund2.CreatedDate = DateTime.Now;      
            }
            _db.Fund.Add(saveFund1);
            _db.Fund.Add(saveFund2);
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        ViewData["FromAccountId"] = new SelectList(_db.Account, "AccountId", "Name");
        ViewData["ToAccountId"] = new SelectList(_db.Account, "AccountId", "Name");
        return View(fund);
    }

有人想改进这个吗?

标签: vb.netasp.net-core-mvc

解决方案


推荐阅读