|
■No79405 (vespha さん) に返信
自分の関わったスレッドがこのまま放置で終わってしまっては何なので一言・・・
> その辺のクラスへの処理の切り分けはどうしているのでしょうか。
スキャフォールディング機能を使って作る時のように分ければいいと思います。
ちなみに、Visual Studio 2010 を使って、AdventureWorksLT サンプルデータベースから
DB First で EDM を作り、それをベースにスキャフォールディング機能を利用してコント
ローラーとビューを自動生成させると、質問者さんのコードに該当する Edit アクション
メソッドは以下のようになります。
モデル(ビジネスロジック)のクラスの初期化、POST されてきたパラメータの引渡し、
DB を更新するためのメソッドの起動はコントローラーのアクションメソッドで行なわれ
ています。
それら別のクラスに移す意味はなさそうです。というより、開発工数や保守性を考えたら、
そんなことはすべきでないと思います。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AdventureWorksLT;
namespace Mvc4App.Controllers
{
public class Address2Controller : Controller
{
private AdventureWorksLT_DataEntities db = new AdventureWorksLT_DataEntities();
// ・・・中略・・・
[HttpPost]
public ActionResult Edit(Address address)
{
if (ModelState.IsValid)
{
db.Address.Attach(address);
db.ObjectStateManager.ChangeObjectState(address, EntityState.Modified);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(address);
}
// ・・・中略・・・
}
}
ちなみに、
db.Address.Attach(address);
db.ObjectStateManager.ChangeObjectState(address, EntityState.Modified);
db.SaveChanges();
は、
var address = (from a in db.Address
where a.AddressID == id
select a).FirstOrDefault<Address>();
UpdateModel<Address>(address);
db.SaveChanges();
と同じ結果になります。
|