假设我有一个名为 User 的类,这是我的基本实体(我将它与 DbContext 一起用作 DbSet 用户),我将其用作我的数据访问层的底层。假设类看起来像这样:
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 服务器发出的查询,我加载的只是 Id/Active 对,我更新的所有内容也是基于 id 的 Active 更改。
但是我不喜欢代码的外观。假设我有具有 50 个属性的实体和具有 25 个属性的视图。我不想在我说 IsModified=true 的地方写 25 行。
所以我的问题是:有没有更有效的方法来做同样的事情,而不深入研究任何基于反射的方法?我想将数据从任何视图模型传输到实体,然后只保存这些属性。
提前感谢您的回复,我希望我的问题足够清楚:)