2017-08-03 13 views
1

Entity Framework(EF)データスキャフォールディングで作成されたCRUDオペレーションを使用した最初のASP.NET MVC 5プログラムを作成しています私は子供のレコードのuserID & updateDateを作成せずに、子テーブルに子テーブルが追加、更新、または削除されたときに親テーブルを更新する方法について質問します。ASP.NET MVC5の子テーブルにレコードが追加されたときの親テーブルの更新方法Entity Frameworkデータスキャフォールディング

私は親テーブルのuserID & updateDateフィールドを持っています。子テーブルを使ってCUD操作(追加、更新、または削除)を行うと、誰か/レコードが変更されたことを反映するために、親テーブルをuserID & updateDateで更新します。 EFデータスキャフォールディングを使用してこれを行うにはどうすればよいですか?私は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

申し訳ありませんが、私は「バインド」の悪用の世界を根絶する使命にあります。それを使用しないでください。コードの重複、強く型付けされていないメンテナンスの悪夢など、さまざまな理由で悪いことです。代わりにビューモデルを使用し、人生を救いましょう。 'Bind'は*両方の子犬と子猫を殺します。 –

答えて

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は言ったように、実際に親レコードを取得し、更新を行い、親と子の両方を保存します。それを短くすれば、データベース上でトリガーを設定するようなことをしなければならないだろうが、これはデータベースを台無しにする優れた方法だ。 –

関連する問題