仅更新模型的一部分

时间:2011-06-01 12:10:19

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我正在使用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; }
}

2 个答案:

答案 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();

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