只更新模型的一部分

我使用ASP.NET MVC 3和实体框架代码优先。 我有一个页面(使用Razor View Engine),它允许用户更新模型(产品)的各个部分:

@ Html.LabelFor(model => model.Overview)@ Html.TextAreaFor(model => model.Overview)

@Html.LabelFor(model => model.Description)
@Html.TextAreaFor(model => model.Description)

@Html.HiddenFor(model => model.ProductId)

我的控制器方法如下所示:

[HttpPost]
public ActionResult Update(Product product)
{
  db.Products.Attach(product);
  db.SaveChanges();
}

我想要做的就是更新产品模型的“概览”和“描述”属性。 但是,当我运行代码时,模型不会在数据库中更新,而且也不会出现任何错误。

当我在调试时检查产品对象时,我发现虽然ProductId,Overview和Description字段是正确的(按照FORM POST),但其他字段是NULL(我期望)。

我想知道产品对象的不完整状态是否导致它不保存到数据库?

这里是模型:

公共类Product {public int ProductId {get; 组; }

    [Required(ErrorMessage = "Please enter a description")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [DataType(DataType.MultilineText)]
    public string Overview { get; set; }

    public int SupplierId { get; set; }
    public virtual Supplier Supplier { get; set; }
}

在编辑时,首先尝试从数据库中选择一个现有记录(您想要编辑的记录),然后使用从表单收集的值(即将模型传递到控制器操作中)更新它,然后保存。

例如

[HttpPost]
public ActionResult Update(Product productPassedInFromView)
{ 
    Product productToEdit = db.Products.Find(productPassedInFromView.ID);

    productToEdit.Property1 = productPassedInFromView.Property1;
    productToEdit.Property2 = productPassedInFromView.Property2;
    //Continue for all the fields you want to edit.

    db.SaveChanges();
}

如果您知道要更新的实体的哪些属性,则可以使用EF中的ChangeTracker仅将这些属性标记为已更改。 下面是一本来自优秀书籍[Programming Entity Framework:DbContext](http://shop.oreilly.com/product/0636920022237.do)的修改示例:

db.Products.Attach(product);
var entry = db.Entry(product);
entry.State = EntityState.Unchanged;
entity.Property(p => p.Overview).IsModified = true;
entity.Property(p => p.Description).IsModified = true;
db.SaveChanges();

这将为您节省往返数据库的时间。 但当然,只有当你知道哪些属性正在改变时它才有效。 还有其他一些方法可以达到这个目的,但这个最直接。

链接地址: http://www.djcxy.com/p/60445.html

上一篇: Updating only part of a model

下一篇: How should a model be structured in MVC?