在Entity Framework中向DBContext添加新行将覆盖最后一个条目

时间:2015-02-20 15:49:34

标签: c# entity-framework

问题:
每次添加新记录时,它都会覆盖最后一条记录,因此在循环结束后,总是会留下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
});

0 个答案:

没有答案