私の意見では、実際には2つの別々の「モデル」を操作する必要があります。ViewModelはMVCプロジェクトにあり、ビューにレンダリングされます。そして、ビジネスロジック層の2番目のEntityModel。これは、標準の「エンタープライズ」プログラミング設計です。それはあなたにあなたのデータのより多くの制御を与えます。アイデアはこれです。
UIアセンブリ(MVCプロジェクト)
ViewModelの定義
public class MyModel {
public int ID { get; set; }
.... // bunch of other properties
}
コントローラ
public class InterestingController : Controller {
public ActionResult CreateNewWidget() {
var model = new MyModel();
return View(model);
}
[HttpPost]
public ActionResult CreateNewWidget(MyModel model) {
if(ModelState.IsValid) {
// your ctor can define the order of your properties being sent in and you can set the entity values in the ctor body however you choose to. Note never SET an ID/Primary key on a Create, let the DB handle that. If you need to return the new Key value, get it from the insert proc method in your DAL and return it up the stack
var entityModel = new EntityFromBLL(model.Name, model.OtherProperty, ... etc);
entityModel.Save(User.Identity.Name); // your save method should always capture WHO is doing the action
}
return View(model);
}
public ActionResult UpdateExistingWidget(int id) {
var entityModel = new EntityFromBLL(id); // get the existing entity from the DB
var model = new MyModel(entityModel.ID, entityModel.Name, ... etc); // populate your ViewModel with your EntityModel data in the ViewModel ctor - note remember to also create a parameterless default ctor in your ViewModel as well anytime you create a ctor in a ViewModel that accepts parameters
return View(model);
}
[HttpPost]
public ActionResult UpdateExistingWidget(MyModel model) {
if(ModelState.IsValid) {
var entityModel = new EntityFromBLL(model.ID); // always pull back your original data from the DB, in case you deal with concurrency issues
// now go thru and update the EntityModel with your new ViewModel data
entityModel.Name = model.Name;
//... etc set all the rest of the properties
// then call the save
entityModel.Save(User.Identity.Name);
}
return View(model)
}
}
エンティティモデルは、プライベートフィールド、パブリックプロパティ、挿入に必要なすべてのフィールド(主キーを除く)を受け取るctor、主キーを受け取り、内部ロードメソッドを静的に呼び出して返すことができるctorで定義する必要があります設定されたオブジェクト。ビジネスルールとプロパティの検証、および単一のSaveメソッド。Saveメソッドは、すべてのプロパティが設定された後にIsDirtyビットをチェックし、それぞれのInsertメソッドまたはUpdateメソッドを呼び出す必要があります。DTOを渡すDALを呼び出す必要があります。