【问题标题】:Nested entity not being saved嵌套实体未保存
【发布时间】:2017-04-03 13:39:27
【问题描述】:

我有以下方法可以保存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);
}

除了EmailAccount 之外,EmailTemplate 中的所有内容都可以很好地保存。在调试器中,我可以看到在调用 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; }
}

【问题讨论】:

  • 请发布您的模型,包括主要实体和引用的模型。
  • 更新了我的问题
  • 如何指定(配置)EmailTemplate 和 Account 之间的映射。我只能看到 public virtual EmailAccount EmailAccount { get; set; } 没有外键。你在OnModelCreating 方法中使用fluent api 吗?
  • 我只在多对多关系上使用 fluent api,因为当您指定公共虚拟财产时,EF 会自动检测一对多。它只是多对多的问题。我只对知道哪些电子邮件帐户与电子邮件模板相关联感兴趣。我不在乎从电子邮件帐户中查找所有模板。
  • 您需要将public int EmailAccountId { get; set; } 添加到您的EmailTemplate 然后配置映射。 EF 将知道何时添加或更新引用的帐户。

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


【解决方案1】:

我在附加之前进行了修改,因此未跟踪更改。

这行得通

        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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多