MVC3 +实体框架,更新实体中的选择性字段

时间:2012-06-26 00:44:17

标签: c# asp.net-mvc-3 entity-framework

假设我正确设置了实体框架,并且POCO类具有正确的关系等。

<!-- language: c# -->
public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SomeFieldIDontWantUsersToEdit { get; set; } // there are a lot of these
    public IList<Address> Addresses { get; set; }
}

public class Address
{
    public string EntireAdressInOneLine { get; set; }
}

当我向用户显示内容时,我只想显示FirstName和LastName以及地址。这有效,视图运作正常。

这是我的观点:

<!-- language: c# -->
@using (Html.BeginForm(actionName: null, controllerName: null, method: FormMethod.Post))
{
    @Html.TextBoxFor(model => Model.Person.FirstName)
    @Html.TextBoxFor(model => Model.Person.LastName)
    @Html.HiddenFor(model => Model.Person.Id)
}

但是到了更新此条目的时候,我迷路了。如果这是更新操作:

<!-- language: c# -->
[HttpPost]
public ActionResult UpdatePerson(int personId, Person updatedPerson)
{
    if (ModelState.IsValid)
    {

    }
}

当我提交表单时,模型绑定器将拾取我想要的Person对象。很酷,这很有效。当然,SomeFieldIDontWantUsersToEdit将为null,因为它没有包含在视图中 - 我理解那部分。

我的问题是,有没有办法告诉EF我只想更新这个实体中的某些属性,并使用其他所有属性的值。

我希望SomeFieldIDontWantUsersToEdit的原始值说明相同,但希望允许用户编辑名字和姓氏。如果它只有1或2个字段,当然,我可以手动完成,但实际代码中有更多字段。

也许更好的问题是,这样做的正确/推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您不想手动进行“映射”,请使用Automapper

答案 1 :(得分:1)

为什么不实际创建ViewModel,例如:

public class PersonalInfoModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

让你的行动收到那种类型:

[HttpPost]
public ActionResult UpdatePerson(PersonalInfoModel updatedPerson)
{
    if (ModelState.IsValid)
    {

    }
}

在这种情况下,您应该转到上下文,使用PersonalInfoModel.Id加载真实实体,然后只更新要更新的两个属性。

您不必将真实实体用作模型,您可以创建自己的信息表示(在某些情况下甚至建议使用,而不是使用实际实体)。