假设我正确设置了实体框架,并且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个字段,当然,我可以手动完成,但实际代码中有更多字段。
也许更好的问题是,这样做的正确/推荐方法是什么?
答案 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
加载真实实体,然后只更新要更新的两个属性。
您不必将真实实体用作模型,您可以创建自己的信息表示(在某些情况下甚至建议使用,而不是使用实际实体)。