只更新模型的一部分
我使用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