实体使用ViewModel中的空值覆盖

时间:2012-08-06 15:41:34

标签: entity-framework

我在MVC应用程序中遇到了一点错误。

管理员可以编辑用户个人资料。包括用户所在的角色。

所以我有一个用于“EditUser”的ViewModel:

public class EditUserViewModel
{
    public User User { get; set; }
    public IEnumerable<SelectListItem> PossibleRoles { get; set; }
    public int[] SelectedRoles { get; set; }
}

因此,在我的EditUser.cshtml页面上,我只运行一个@ Html.EditorFor(Model =&gt; model.User),根据我的MetaData类的限制生成所需的字段。

在那里,例如我做了这样的注释:

    [ScaffoldColumn(false)]
    public string Password { get; set; }

这个问题是,当我回发我的编辑表单时,设置为Scaffold false的值为null。这似乎是合乎逻辑的,因为这些属性没有编辑框。

因此,当我保存我的实体时,它会用null覆盖值值。 (例如,如果我更新用户的名字并保存,则用null覆盖用户的密码,EF会抛出错误) 有没有什么方法可以自动更新值(根据我能够编辑的值(MetaDataClasses)?)?否则,如果我将它们复制到实体框架中新获取的实体,并且我应该将注释更改为Scaffold(false),我需要在代码中添加一条规则,将新值复制到实体中。这似乎不对。

提前致谢。

2 个答案:

答案 0 :(得分:2)

EF适用于整个实体,如果您决定不显示实体的某些部分,您还必须在保存更改时处理此问题。您有多种选择:

  • 如果您不想显示其所有数据,请勿使用该实体。使用特殊视图模型,而不仅包含要显示的数据。使用该视图模型收集更改并将其复制到实体(例如,您可以使用AutoMapper将实体转换为视图模型,反之亦然)。
  • 从数据库加载实体并仅更新要从编辑视图模型中保留的字段
  • 不要将整个用户实体设置为已更新。而是要更新set manually every property

答案 1 :(得分:0)

您还可以使用隐藏的输入。不知道为密码做这件事是不是一个好主意。

@Html.HiddenFor(model => model.Property)