我正在使用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 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; }
}
答案 0 :(得分:4)
在编辑时,首先尝试从数据库中选择现有记录(要编辑的记录),然后使用从表单中收集的值(即传递到控制器操作中的模型)更新它,然后保存它
E.g。
[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();
}
答案 1 :(得分:-1)
如果您知道要更新的实体的哪些属性,则可以使用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();
这将节省您到数据库的往返。但当然只有当您知道哪些属性正在发生变化时,它才有效。还有其他一些方法可以达到这个目的,但这个方法最直接。