【问题标题】:MVC3 + Entity Framework, updating selective fields in an entityMVC3 + Entity Framework,更新实体中的选择性字段
【发布时间】:2012-06-26 00:44:16
【问题描述】:

假设我正确设置了实体框架,并且 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 个字段,当然,我可以手动完成,但实际代码中的字段要多得多。

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

【问题讨论】:

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


    【解决方案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 加载真实实体,然后只更新您要更新的两个属性。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-09
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 2011-10-29
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        相关资源
        最近更新 更多