实体框架 - 在更新时保存子实体 [英] Entity Framework - Saving child entities on update

查看:106
本文介绍了实体框架 - 在更新时保存子实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个发票实体,它有子帐户InvoiceLog实体。当我首先创建发票并添加其InvoiceLog实体并保存时,它可以正常工作。但是,如果我然后编辑发票并尝试添加其他InvoiceLog实体,则它完全忽略新的InvoiceLog实体,并且根本不保存它们。任何想法我做错了什么?

  // POST:/ Secure /发票/保存/ 
[AcceptVerbs (HttpVerbs.Post)]
public ActionResult保存(发票发票)
{
invoice.UpdateDate = DateTime.Now;
invoice.DeveloperID = Developer.DeveloperID;
invoice.InvoiceStatusID =(int)Enums.InvoiceStatus.Open;
if(invoice.InvoiceID == 0)
{//插入新发票。
DataContext.InvoiceData.Insert(发票);
}
else
{//附加现有发票。
DataContext.InvoiceData.Attach(发票);
}
AddHours(发票);
//保存更改。
DataContext.SaveChanges();
//重定向到发票列表。
return RedirectToAction(Index);
}

private void AddHours(发票发票)
{
//获取现有日志。
IQueryable< InvoiceLog> existingLogs = null;
if(invoice.InvoiceID> 0)
{
existingLogs = DataContext.InvoiceData.GetLogs(invoice.InvoiceID);
}
//创建新的日志。
var numDays = invoice.EndDate.Subtract(invoice.StartDate).TotalDays;
for(int k = 0; k <= numDays; k ++)
{
//检查日志是否已经存在。
var existingLog = existingLogs.ToList()。FindIndex(l => l.LogDate == invoice.StartDate.AddDays(k));
if(existingLog == -1)
{
//添加新日志。
var log = new InvoiceLog();
log.CreateDate = DateTime.Now;
log.UpdateDate = DateTime.Now;
log.Hours = 0;
log.InvoiceID = invoice.InvoiceID;
log.LogDate = invoice.StartDate.AddDays(k);
invoice.InvoiceLogs.Add(log);
}
}
}

谢谢,
Justin

解决方案

您可以尝试添加 InvoiceLogs code>发票:

  else 
{//附加现有发票。
AddHours(发票);
DataContext.InvoiceData.Attach(发票);
}


I have an Invoice entity and it has child InvoiceLog entities. When I first create an Invoice and add its InvoiceLog entities and save, it works fine. However, if I then edit the Invoice and try to add additional InvoiceLog entities, it completely ignores the new InvoiceLog entities and doesn't save them at all. Any ideas what I'm doing wrong?

//POST: /Secure/Invoices/Save/
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Save(Invoice invoice)
        {
            invoice.UpdateDate = DateTime.Now;
            invoice.DeveloperID = Developer.DeveloperID;
            invoice.InvoiceStatusID = (int)Enums.InvoiceStatus.Open;
            if (invoice.InvoiceID == 0)
            {//inserting new invoice.
                DataContext.InvoiceData.Insert(invoice);
            }
            else
            {//attaching existing invoice.
                DataContext.InvoiceData.Attach(invoice);
            }
            AddHours(invoice);
            //save changes.
            DataContext.SaveChanges();
            //redirect to invoice list.
            return RedirectToAction("Index");
        }

        private void AddHours(Invoice invoice)
        {
            //get existing logs.
            IQueryable<InvoiceLog> existingLogs = null;
            if(invoice.InvoiceID > 0)
            {
                existingLogs = DataContext.InvoiceData.GetLogs(invoice.InvoiceID);
            }
            //create new logs.
            var numDays = invoice.EndDate.Subtract(invoice.StartDate).TotalDays;
            for (int k = 0; k <= numDays; k++)
            {
                //check if log already exists.
                var existingLog = existingLogs.ToList().FindIndex(l => l.LogDate == invoice.StartDate.AddDays(k));
                if (existingLog == -1)
                {
                    //add new log.
                    var log = new InvoiceLog();
                    log.CreateDate = DateTime.Now;
                    log.UpdateDate = DateTime.Now;
                    log.Hours = 0;
                    log.InvoiceID = invoice.InvoiceID;
                    log.LogDate = invoice.StartDate.AddDays(k);
                    invoice.InvoiceLogs.Add(log);
                }
            }
        }

Thanks, Justin

解决方案

You can try to add InvoiceLogs items before attaching the invoice:

    else
    {//attaching existing invoice.
        AddHours(invoice);
        DataContext.InvoiceData.Attach(invoice);
    }

这篇关于实体框架 - 在更新时保存子实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆