私の基本エンティティであるUserというクラスがあり(DbSetユーザーとしてDbContextで使用します)、Data-Access-Layersのグラウンドレベルとして使用するとします。クラスが次のようになっているとしましょう。
public class User
{
[Key]
public int Id { get; set; }
public bool Active { get; set; }
public string Description { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public byte[] Photo { get; set; }
public DateTime Created { get; set; }
}
ここで、ユーザーがアクティブかどうかだけを表示する純粋なビューと、その値を変更できる単純なチェックボックスが必要です。他のエンティティプロパティ、特にプロパティPhotoは非常識なので、ロードしたくありません。次のようなActivateUserModelを作成しました。
public class ActivateUserModel
{
[Key]
public int Id { get; set; }
public bool Active { get; set; }
}
Activateと呼ばれる厳密に型指定されたビューがあります。これはActivateUserModelを取得して表示し(これはチェックボックスであり、Idに対して非表示になっています)、次に[HttpPost] Activateアクションを実行して、ActivateUserModelをキャプチャし、それをUserエンティティに変換して、変更をデータベースに保存します。 。これはPOSTアクションです。
[HttpPost]
public ActionResult Activate(ActivateUserModel model)
{
if (ModelState.IsValid)
{
User user = new User { Id = model.Id, Active = model.Active };
db.Users.Attach(user);
db.Entry(user).Property(u => u.Active).IsModified = true;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
これは魅力のように機能します。SQL Serverに対して発行されたクエリを監視しました。ロードするのは、IDとアクティブのペアだけです。更新するのも、IDに基づくアクティブな変更です。
しかし、私はそれがどのように見えるかというコードが好きではありません。50個のプロパティを持つエンティティと25個のビューがあるとします。IsModified=trueと言う25行を書きたくありません。
だから私の質問は:反射ベースの方法を掘り下げることなく、同じことをするためのより効率的な方法はありますか?任意のビューモデルからエンティティにデータを転送してから、それらのプロパティのみを保存したいと思います。
事前に回答ありがとうございます、私は質問を十分に明確にしたことを願っています:)