2

假设我正确设置了实体框架,并且 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 将是空的,因为它没有包含在视图中——我理解那部分。

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

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

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

4

2 回答 2

1

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

于 2012-06-26T00:53:57.383 回答
1

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

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

只需让您的 Action 接收该类型:

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

    }
}

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

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

于 2012-06-26T03:25:39.003 回答