2011-06-01 55 views
1

我正在使用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(我期望)。

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

这里是模型:

公共类产品 { 公众诠释产品编号{获得;组; }

[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; } 
} 

回答

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

如果您知道要更新的实体的哪些属性,则可以使用EF中的ChangeTracker将仅更改的属性标记为已更改。下面是一个修改实例从优秀图书[编程实体框架:的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(); 

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