实体的每个属性是否都需要包含在更新中

本文关键字:包含 更新 属性 是否 实体 | 更新日期: 2023-09-27 18:00:54

我有一个实体"Rep"。。。

public partial class rep
{
    public string repid { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Title { get; set; }
    public string Department { get; set; }
    many, many more properties...
}

然后我有一个表格,只更新代表的名字和姓氏。提交表单时,会更新名字和姓氏,但其他所有属性都设置为null。

我希望其他属性保持独立,以便它们保留现有值。

我可以将实体的所有属性都包含在隐藏的表单字段中,以将它们的值传递给Edit方法,但有更好/更简单的方法吗?

我熟悉设置IsModified属性。。。

entry.Property(e => e.Title).IsModified = true;

但这似乎也没有必要。这是一条路,还是有更好的路?

实体的每个属性是否都需要包含在更新中

用于呈现视图和更新实体的代码非常相关,但缺少,但我可以猜测它们的样子:

@model ...rep
@using (Html.BeginForm()) {
    @Html.HiddenFor(m => m.repid )
    @Html.TextBoxFor(m => m.FirstName )
    @Html.TextBoxFor(m => m.LastName)
    <input type="submit" />
}

在你的控制器中:

[HttpPost]
public ActionResult Update(rep model)
{
    using (var context = new MyContext())
    {
        context.reps.Attach(model);
        context.SaveChanges();
    }
    return RTA(...);
}

这是附加发布的实体,这是一个上下文及其更改跟踪器未知的全新对象。通过附加这样的实体,可以告诉上下文这是您想要保存的新表示,即大多数属性都设置为null

您可以通过首先检索实体,然后只更新所需的属性来轻松解决此问题:

[HttpPost]
public ActionResult Update(rep model)
{
    using (var context = new MyContext())
    {
        var entity = context.reps.Find(rep.repid);
        entity.FirstName = model.FirstName;
        entity.LastName = model.LastName;           
        context.SaveChanges();
    }
    return RTA(...);
}

但是不要这样做。请参阅MVC中的ViewModel是什么?或ViewModel最佳实践,或在"mvc视图模型"上搜索网站或本网站。

主要是因为您的数据库实体包含不希望显示或更新的列(批量分配(,而且迟早您会希望在视图中使用无法保留在数据库实体中的额外属性(下拉数据、脚本变量、相关实体(。

一般来说,你可以说:不要将实体模型用于视图模型,尤其是当它们被发布回来时。因此,视图模型是前进的方向:

public class RepresentativeViewModel
{
    public string RepID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }    
}

然后,您只需要更改视图的模型声明:

@model ...RepresentativeViewModel

您的控制器看起来是最简单的解决方案:

[HttpPost]
public ActionResult Update(RepresentativeViewModel model)
{
    using (var context = new MyContext())
    {
        var entity = context.reps.Find(rep.RepID);
        entity.FirstName = model.FirstName;
        entity.LastName = model.LastName;           
        context.SaveChanges();
    }
    return RTA(...);
}

当然,您可以将entity.FirstName = model.FirstName;映射代码替换为一些自动化的解决方案,例如使用AutoMapper。

您可以像前面提到的那样使用IsModified属性,也可以创建一个具有要更改的属性的视图模型,并使用映射器(如AutoMapper(将值从输入复制到实体。通常,我有一个基类,它有我可修改的数据,还有一个子类,它有关系和数据,我不想更改,比如CreatedBy之类的。隐藏的领域是不确定的方式去。

有两种方法可以尝试

  1. 只使用要更新的特性创建视图模型。

  2. 将其他属性的值存储在隐藏字段中,它们不会返回空

相关文章: