2017-08-03 56 views
1

我在寫我的第一個ASP.NET MVC 5程序與實體框架(EF)內置CRUD操作數據腳手架工作和我有一個問題,如何在子表添加,更新或刪除/從子表上更新父表,而無需在每個子記錄上創建用戶ID & updateDate。如何更新父表時,記錄添加到子表在ASP.NET MVC5實體框架數據支架

我有父表上的用戶ID & updateDate字段。當我使用子表進行CUD操作(添加,更新或刪除)時,我想用userID更新父表,以更新記錄被更改的人員/時間。我如何使用EF Data Scaffolding來做到這一點?由於我對MVC & EF沒有太多的經驗,如果您可以在代碼中告訴我這是如何在我的控制器中完成的,我將不勝感激。到目前爲止,我可以使用單個表的模型爲EF視圖添加一個新的子記錄,以便查看特定的視圖。我做了一些搜索,並找到了一種方法來通過模型綁定多個表,如果他們都在視圖模型,但我想知道是否有任何其他方式來使用EF數據腳手架成功完成後更新父表添加或更新到子表。我還發現了一篇關於使用SaveChanges(false)& AcceptAllChanges()的文章,一旦我找出添加或更新子記錄後如何更新父記錄,這可能很有用。我提前感謝您的建議。

控制器:

[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 
} 
+0

對不起,但我正在執行一項任務,根除「綁定」的弊端。不要使用它。這有多種原因是不好的:代碼重複,沒有強類型,維護噩夢等。改用視圖模型並保存生命。 '綁定'殺死*小狗和小貓。 –

回答

0

所以根據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 
} 
0

你問的最佳方式做到這一點..那麼最好的辦法是有父和子表中的CREATEDATE,UpdateDate領域。所以,當你更新孩子時,你更新該表中的child.UpdateDate,而不是在其父表中。長期以來,這是一種有效,常見和遵循的方法。 現在,如果要在更新任何子記錄時更新父項,從管理數據透視圖來看沒什麼意義,但通過存儲過程或獲取父記錄肯定可行,並設置更新後的子項,然後更新家長和EF會知道該怎麼做。

+0

謝謝你的回覆;我澄清了我的問題。我想這樣做,而不是爲我添加到子表的每個子記錄創建userID和updateDate。 – Bob

+1

然後,正如@Assil所說,實際上得到父記錄,進行更新並保存父母和孩子。簡而言之,你必須做一些事情,比如在數據庫上設置觸發器,但這是一個很好的方式來搞砸你的數據庫。 –