我正在尝试更新数据库中的Applicant
和ApplicantNotification
OneToOne关系表。但是,我正在尝试的是不起作用。
我通过EF选择对象,然后覆盖属性,因此我假设EF将跟踪更改,但不会反映在数据库中。
问题: 如何更新EF中的两个实体?
申请人:
[Index]
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ApplicantID { get; set; }
[Required]
public string ApplicantTitle { get; set; }
[Required]
public string Firstname { get; set; }
[Required]
public string Lastname { get; set; }
[Required]
public string Address { get; set; }
[Required]
public string Address1 { get; set; }
[Required]
public string Address2 { get; set; }
[Required]
public string Address3 { get; set; }
[Required]
public string Postcode { get; set; }
[Required]
public string CaseReference { get; set; }
[DataType(DataType.Date)]
public DateTime DateOfBirth { get; set; }
public ApplicantNotification Notification { get; set; }
ApplicantNotification:
[Index]
[Key, Column("ApplicantID"), ForeignKey("Applicant")]
public int ApplicantNotificationID { get; set; }
public bool FirstNotification { get; set; }
public bool SecondtNotification { get; set; }
public bool ThirdNotification { get; set; }
public bool FinalNotification { get; set; }
[DataType(DataType.Date)]
public DateTime? ReminderDate { get; set; }
public int ReminderFrequency { get; set; }
[DataType(DataType.Date)]
public DateTime? FirstNotificationDate { get; set; }
[DataType(DataType.Date)]
public DateTime? SecondNotificationDate { get; set; }
[DataType(DataType.Date)]
public DateTime? ThirdNotificationDate { get; set; }
public bool IsArchive { get; set; }
public virtual Applicant Applicant { get; set; }
方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ApplicantNotificationViewModel model)
{
if (ModelState.IsValid)
{
//select from ef
var applicant = (from a in db.Applicants
where a.ApplicantID == model.ApplicantID
select a).FirstOrDefault();
var applicantNotification = (from an in db.ApplicantNotifcations
where an.ApplicantNotificationID == model.ApplicantID
select an).FirstOrDefault();
SetApplicant(model, applicant);
SetApplicantNotification(model, applicantNotification);
using (var context = new WorkSmartContext())
{
try
{
db.Entry(applicant).State = EntityState.Modified;
db.Entry(applicantNotification).State = EntityState.Modified;
context.SaveChanges();
}
catch (Exception ex)
{
}
}
return RedirectToAction("Index");
}
return View(model);
}
由于
答案 0 :(得分:0)
你看起来试图越过dbContexts或其他东西,没有看到这个WorkSmartContext定义很难拼凑,但你可能想要的更像是这样:
var applicant = db.Applicants
.Include(a=>a.Notification)
.FirstOrDefault(a=>a.ApplicantId = model.ApplicantId);
if (applicant == null)
// Handle missing Applicant scenario here.
SetApplicant(model, applicant);
SetNotification(model, applicant.Notification);
db.SaveChanges();
您的申请人提及相关通知。用它。您不需要加载个别相关实体。您可以执行诸如检查现有相关实体,更新它们,在必要时插入等操作。如果您需要更新不相关的实体但确保所有实体成功或失败,请使用事务或工作单元模式。 (我猜测这个WorkSmartContext应该是,但不是源于或绑定到" db"我不知道是怎么回事。)