C# 如何从实体框架中检索控制器中的现有上下文值?

C# 如何从实体框架中检索控制器中的现有上下文值?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我现在做这件事的方式(有效)感觉有点不舒服。当我编辑实体时,我不希望用户更改后面的关键审核字段,例如,当实体最初创建时,它会自动填充DateAdded、AddedBy、EditedBy 要停止人们编辑这些值,我不会在编辑时将其绑定到包含中: public ActionResult Edit([Bind(Include = "Id,AccountName")] Account account) 这意味着我必须这样做才能恢复原始值,否则它们会被设置为null account.DateAdded =

我现在做这件事的方式(有效)感觉有点不舒服。当我编辑实体时,我不希望用户更改后面的关键审核字段,例如,当实体最初创建时,它会自动填充DateAdded、AddedBy、EditedBy

要停止人们编辑这些值,我不会在编辑时将其绑定到包含中:

public ActionResult Edit([Bind(Include = "Id,AccountName")] Account account)
这意味着我必须这样做才能恢复原始值,否则它们会被设置为null

account.DateAdded = db.Accounts.Where(c => c.Id == account.Id).Select(d => d.DateAdded).FirstOrDefault();
account.AddedBy = db.Accounts.Where(c => c.Id == account.Id).Select(a => a.AddedBy).FirstOrDefault();
account.EditedBy = User.Identity.Name;

有没有更好的方法来解决这个问题,下面的方法很有效,但效率不高。

推荐的方法是使用只包含需要显示/编辑的项目的视图模型

public class AccountVM
{
  public int ID { get; set; }
  public string Name { get; set; }
}
然后在视图中使用,并发回控制器,根据
ID
属性获取数据模型,并将视图模型属性映射到您的数据模型并保存。注意,
[Bind]
属性不是必需的

使用视图模型有许多优点,包括视图特定属性的应用和防止重叠攻击。有关更多信息,请参阅的答案


诸如之类的工具可以更轻松地在数据和视图模型之间映射ata。

推荐的方法是使用仅包含需要显示/编辑的项目的视图模型

public class AccountVM
{
  public int ID { get; set; }
  public string Name { get; set; }
}
然后在视图中使用,并发回控制器,根据
ID
属性获取数据模型,并将视图模型属性映射到您的数据模型并保存。注意,
[Bind]
属性不是必需的

使用视图模型有许多优点,包括视图特定属性的应用和防止重叠攻击。有关更多信息,请参阅的答案


诸如之类的工具可以更轻松地在数据模型和视图模型之间映射ata。

使用仅包含所需属性的视图模型。在POST方法中,从数据库获取数据模型,将视图模型属性映射到它并保存数据模型-参考我同意Stephen的观点,让实体使用实体框架和在视图或服务中使用的其他类(viewmodel,dto)是一个好的做法。一个优秀的工具可以帮助您在实体和viewmodel以及viceversa之间进行映射,它就是automapper:谢谢Stephen,它现在看起来非常明显!如果你转换成一个答案,我会把它标记为完整。再次感谢。另一个选项是将这些属性添加到视图模型中,并在视图中作为隐藏字段传递。请使用仅包含所需属性的视图模型。在POST方法中,从数据库获取数据模型,将视图模型属性映射到它并保存数据模型-参考我同意Stephen的观点,让实体使用实体框架和在视图或服务中使用的其他类(viewmodel,dto)是一个好的做法。一个优秀的工具可以帮助您在实体和viewmodel以及viceversa之间进行映射,它就是automapper:谢谢Stephen,它现在看起来非常明显!如果你转换成一个答案,我会把它标记为完整。再次感谢。另一个选项是将这些属性添加到视图模型中,并将它们作为隐藏字段传递到视图中。