【发布时间】: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