Asp.net mvc 在ASP.NET MVC5实体框架数据脚手架中,当记录添加到子表时,如何更新父表

Asp.net mvc 在ASP.NET MVC5实体框架数据脚手架中,当记录添加到子表时,如何更新父表,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在编写我的第一个ASP.NET MVC 5程序,其中包含由Entity Framework(EF)Data Scaffolding for work构建的CRUD操作。我有一个问题,当在子表上添加、更新或删除子表时,如何更新父表,而不必在每个子记录上创建userID和updateDate 我在父表上有userID和updateDate字段。当我对子表执行CUD操作(添加、更新或删除)时,我希望使用userID和updateDate更新父表,以反映记录更改的时间/人。如何使用EF数据脚手架实现

我正在编写我的第一个ASP.NET MVC 5程序,其中包含由Entity Framework(EF)Data Scaffolding for work构建的CRUD操作。我有一个问题,当在子表上添加、更新或删除子表时,如何更新父表,而不必在每个子记录上创建userID和updateDate

我在父表上有userID和updateDate字段。当我对子表执行CUD操作(添加、更新或删除)时,我希望使用userID和updateDate更新父表,以反映记录更改的时间/人。如何使用EF数据脚手架实现这一点?由于我对MVC和EF没有太多的经验,如果您能在代码中向我展示如何在我的控制器中实现这一点,我将不胜感激。到目前为止,我能够使用特定视图的单个表模型,通过EF数据脚手架添加一个新的子记录。我做了一些搜索,找到了一种方法,通过与多个表(如果它们都在视图模型中)的模型绑定来实现这一点,但我想知道在成功地添加或更新到子表之后,是否还有其他方法可以使用EF数据支架来更新父表。我还发现了一篇关于使用SaveChanges(false)&acceptillchanges()的文章,一旦我了解了如何在添加或更新子记录后更新父记录,这篇文章可能会很有用。我提前感谢你的建议

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "crossWalkID, location, 
  widthOfLeg, legDirection, crosswalkType, qtyBasicOrHatched12, 
  qtyLadderBar16, qtyLadderBar24, cost")] tblStripingQuantity 
  tblStripingQuantity)
{
// Also update UserID & UpdateDate in the tblCrossWalk when 
// tblStrippingQuantity is updated successfully -   Where to do this???
if (ModelState.IsValid)
{
db.tblStripingQuantities.Add(tblStripingQuantity); // Add a new child record 
                                                   // to child table
db.SaveChanges();
return RedirectToAction("Index", "tblCrosswalks", new { id = 
  tblStripingQuantity.crosswalkID });
}
return View(tblStripingQuantity); // ModelState is invalid; return to view
}

你是在问最好的方法。。最好的方法是为父表和子表提供CreateDate、UpdateDate字段。因此,当您更新子级时,您将更新该表中的child.UpdateDate,而不是其父表中的child.UpdateDate。这是一种有效、普遍且长期遵循的方法。
现在,如果您想在更新任何子记录时更新父记录,从管理数据的角度来看,这没有多大意义,但通过存储过程或获取父记录,并设置更新的子记录,然后更新父记录,EF将知道该做什么。

因此,根据Assil的回答,您的ActionResult看起来像这样

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "crossWalkID, location, 
  widthOfLeg, legDirection, crosswalkType, qtyBasicOrHatched12, 
  qtyLadderBar16, qtyLadderBar24, cost")] tblStripingQuantity 
  tblStripingQuantity)
{

if (ModelState.IsValid)
{
// Add a new child record to child table
db.tblStripingQuantities.Add(tblStripingQuantity);                                                    

//Gets crosswalk parent record and updates UserID and Date
var crossWalk = db.tblCrossWalk.Find(tblStripingQuanity.crossWalkID);
crossWalk.UserID = 1234;
crossWalk.UpdateDate = DateTime.Now;

db.SaveChanges();
return RedirectToAction("Index", "tblCrosswalks", new { id = 
  tblStripingQuantity.crosswalkID });
}
return View(tblStripingQuantity); // ModelState is invalid; return to view
}

谢谢你的回复;我已经澄清了我的问题。我希望在不为添加到子表中的每个子记录创建userID&updateDate的情况下执行此操作。然后,正如@Assil所说,实际获取父记录,进行更新并保存父记录和子记录。除此之外,您还必须在数据库上设置触发器之类的操作,但这是破坏数据库的绝佳方式。对不起,我的任务是根除
Bind
滥用的世界。不要用它。它不好的原因有很多:代码重复、不强类型、维护噩梦等等。使用视图模型来代替它,可以挽救生命<代码>绑定杀死小狗和小猫。