问题:
每次添加新记录时,它都会覆盖最后一条记录,因此在循环结束后,总是会留下1条记录。
List<Accounting_InvoiceCheck> liIC = new List<Accounting_InvoiceCheck>();
foreach (Accounting_Invoice invoice in liInvoices.OrderBy(x => x.EntityID).ThenBy(x => x.VendorID))
{
Accounting_InvoiceCheck ic = new Accounting_InvoiceCheck();
ic = invoiceMaster.Check;
ctxAcct.Accounting_InvoiceCheck.add(ic);
//ctxAcct.Entry(ic).State = EntityState.Added
}
ctxAcct.SaveChanges()
以上代码仅占用最后一条记录,因此无论如何,计数始终为1。当我看到其他人的代码在网上做这件事时非常令人沮丧。
概要
我在MVC5应用程序中使用Entity Framework 6。因此,当我调用方法时,我有2个表正在更新。表名是Invoices和InvoiceChecks。关系是,发票是主表,当您支付发票时,您在InvoiceChecks中创建记录。
代码下面是尝试以两种方式添加它(两者都是为了您的目的而查看)。一种是创建一个InvoiceChecks列表,然后调用ctx.AddRange(liIC),该表只留下liIC中的最后一项。我试过的另一种方法是循环并调用ctx.entry(ic).state = EntityState.Added,每次调用时都会覆盖最后一行。
关于为什么的任何想法,无论我如何添加,最后一行总是被覆盖?
List<Accounting_InvoiceCheck> liIC = new List<Accounting_InvoiceCheck>();
foreach (Accounting_Invoice invoice in liInvoices.OrderBy(x => x.EntityID).ThenBy(x => x.VendorID))
{
Accounting_InvoiceCheck ic = new Accounting_InvoiceCheck();
ic = invoiceMaster.Check;
ic.InvoiceID = invoice.ID;
var sumAmt = ctx.Accounting_InvoiceChecks.Where(x => x.InvoiceID == invoice.ID).GroupBy(x => x.InvoiceID).Select(x => new { TransAmt = x.Sum(s => s.CKAmt) });
decimal amt = 0;
if (sumAmt.ToList().Count > 0)
{
amt = sumAmt.FirstOrDefault().TransAmt;
}
amt += invoice.AmtPaying;
ctx.Entry(invoice).Entity.AmtPaying = ic.TransAmt - amt;
ctx.Entry(invoice).State = EntityState.Modified;
ctx.Entry(ic).State = EntityState.Added;
//ctx.Accounting_InvoiceChecks.Add(ic);
//liIC.Add(ic);
}
ctx.Accounting_InvoiceChecks.AddRange(liIC);
ctx.SaveChanges();
更新
所以我发现下面的代码正确地添加了它。但是,我的问题是为什么下面的代码工作,并且在foreach循环开始时ic = new Accounting_InvoiceCheck()
不起作用?
ctxAcct.Accounting_InvoiceChecks.Add(new Accounting_InvoiceCheck()
{
InvoiceID = ic.InvoiceID,
AcctPeriod = ic.AcctPeriod,
BankID = ic.BankID,
CheckDate = ic.CheckDate,
CheckNo = ic.CheckNo,
CKAmt = ic.CKAmt,
Description = ic.Description,
TransAmt = ic.TransAmt,
VendorID = ic.VendorID
});