說我有一個名爲User的類,這是我的基本實體(我使用DbContext作爲DbSet Users),我用它作爲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; }
}
現在我想有純看法,我只顯示用戶是否處於活動狀態,並且簡單的複選框,讓我改變的價值。我不想加載任何其他實體屬性,特別是屬性照片,因爲它只是瘋了。我創建ActivateUserModel認爲是這樣的:
public class ActivateUserModel
{
[Key]
public int Id { get; set; }
public bool Active { get; set; }
}
我都強類型的視圖叫做激活,這需要ActivateUserModel並顯示它(這只是一個複選框,並隱藏編號),然後我有[HttpPost]激活操作捕獲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服務器發出的查詢,並且我加載的所有對都是Id/Active,我更新的所有內容也都是基於id的Active change。
但是我不喜歡它的外觀。假設我有擁有50個屬性的實體,並且查看了25個。我不想在我說IsModified = true的地方寫25行。
所以我的問題是:是否有更有效的方法來做同樣的事情,而無需挖掘任何基於反射的方法?我想將數據從任何視圖模型轉移到實體,然後只保存這些屬性。
預先感謝您的答覆,我希望我做的問題不夠清楚:)
您可以使用Automapper將您的視圖模型與現有用戶同步。 – 2012-04-29 09:41:11