仅更新模型的一部分

我正在使用ASP.NET MVC 3和Entity Framework Code First。 我有一个页面(使用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(); } 

我想要做的就是更新Product模型的Overview和Description属性。 但是,当我运行代码时,模型不会在数据库中更新,我也不会收到任何错误。

当我在调试时检查产品对象时,我看到虽然ProductId,Overview和Description字段是正确的(根据FORM POST),其他字段是NULL(我期望)。

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

这是模型:

public class 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(); 

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