嵌套实体未保存

时间:2017-04-03 13:39:28

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我有以下保存EmailTemplate的方法。根据下拉列表的ID,它将EmailAccount填充为外部实体属性。

public ActionResult Edit([Bind(Include = "EmailAccountId, EmailTemplate")] EmailTemplateViewModel emailTemplateViewModel)
{
    if (ModelState.IsValid)
    {
        if (emailTemplateViewModel.EmailAccountId > 0)
        {
            emailTemplateViewModel.EmailTemplate.EmailAccount = db.EmailAccounts.Find(emailTemplateViewModel.EmailAccountId);
        }
        db.Entry(emailTemplateViewModel.EmailTemplate).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(emailTemplateViewModel);
}

除了EmailTemplate之外,EmailAccount中的所有内容都可以保存。在调试器中,我可以看到在调用db.SaveChanges()之前填充了该属性。

我将实体状态设置为EntityState.Modified,但它没有获取外国财产。

我尝试添加:

db.Entry(emailTemplateViewModel.EmailTemplate.EmailAccount).State = EntityState.Modified;

但是这没用。如何告诉EntityFramework需要保存嵌套实体?

编辑:

根据要求

public class EmailTemplateViewModel
{
    public List<EmailAccount> EmailAccounts { get; set; }
    public EmailTemplate EmailTemplate { get; set; }

    [Display(Name = "Email Account")]
    public int EmailAccountId { get; set; }

    public IEnumerable<SelectListItem> EmailAccountsList
    {
        get
        {
            var allEmails = EmailAccounts.Select(e => new SelectListItem { Value = e.ID.ToString(), Text = e.Email });

            return DefaultEmailAccountList.Concat(allEmails);
        }
    }

    public IEnumerable<SelectListItem> DefaultEmailAccountList
    {
        get
        {
            return Enumerable.Repeat(new SelectListItem
            {
                Value = "-1", 
                Text = "Select Email Account"
            }, count: 1);
        }
    }
}

public class EmailTemplate
{
    public int ID { get; set; }
    [StringLength(50)]
    [Index(IsUnique = true)]
    public string Identifier { get; set; }
    public int Interval { get; set; }

    public string TitleTemplate { get; set; }
    [DataType(DataType.MultilineText)]
    public string BodyTemplate { get; set; }

    public virtual EmailAccount EmailAccount { get; set; }
}

1 个答案:

答案 0 :(得分:0)

在我附加之前我正在修改,因此没有跟踪变更。

这有效

        if (ModelState.IsValid)
        {
            db.Entry(emailTemplateViewModel.EmailTemplate).State = EntityState.Modified;
            if (emailTemplateViewModel.EmailAccountId > 0)
            {
                emailTemplateViewModel.EmailTemplate.EmailAccount = db.EmailAccounts.Find(emailTemplateViewModel.EmailAccountId);
            }

            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(emailTemplateViewModel);