环境:
VS2010,ASP.NET MVC3,EF4.1
我用 public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
context.SaveChanges();
}这样一个方法去更新一个修改过的Product对象,执行这个方法时,没报错。然而我在数据库中去查询,发现这个产品的相关信息并没有被修改。当然,这个方法可以正常的添加一个Product对象。而且,当我下次启动程序,用EF去查询出所有的Product对象时,提示下面的错误:The model backing the 'EFDbContext' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.
谁能帮我看看这个问题啊。
public void SaveProduct(Product product) { if (product.ProductID == 0) { context.Products.Add(product); } else context.Entry(product).State = System.Data.EntityState.Modified; context.SaveChanges(); }
这样就可以了
我看测试了你的代码,现在确实是能更新了。但同时我又多了一个问题,就是当我们利用context.SaveChanges();这个方法来添加数据或者更新数据时,如何判断添加或者更新操作是否成功?通过context.SaveChanges();返回的受影响的行数吗?恩,如果是添加或者更新一笔数据,确实可以这样判断。但如果我同时删除了主表和从表的数据,这种情况下,很难预先知道要被删除的行数,而且context.SaveChanges();会返回主表和从表总共被删除的行数,这种情况下利用context.SaveChanges();来判断删除操作是否成功就不太理想了。请问,你是如何判断添加或者更新操作是否成功的?
问题中没有提供修改数据的代码。
修改数据时,要先通过EF从数据库中取出数据,然后更新需要修改的属性,然后context.SaveChanges();
dudu,我做的例子是按照Pro.ASP.NET.MVC.3.Framework(3rd+Edition)这本书中的第7-9章的那个SportsStore示例做的,具体来说修改产品信息的这个例子是第9章讲到的。以下是相关的代码:
用于生成产品信息的视图代码:
@model SportsStore.Domain.Entities.Product
@{
ViewBag.Title = "Admin: Edit" + @Model.Name;
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<h1>Edit @Model.Name</h1>
@using (Html.BeginForm("Edit", "Admin",
FormMethod.Post, new { enctype="multipart/form-data" }))
{
@Html.EditorForModel()
<div class="editor-label">Image</div>
<div class="editor-field">
@if (Model.ImageData == null)
{
@:None
}
else
{
<img width="150" height="150"
src="@Url.Action("GetImage","Product",new {Model.ProductID})" />
}
<div>Upload new image:<input type="file" name="Image" /></div>
</div>
<input type="submit" value="Save" />
@Html.ActionLink("Cancel and return to List", "Index")
}
点击上面视图中的Save按钮后,调用的Action代码:
[HttpPost]
public ActionResult Edit(Product product, HttpPostedFileBase image)
{
if (ModelState.IsValid)
{
if (image != null)
{
product.ImageMimeType = image.ContentType;
product.ImageData= new byte[image.ContentLength];
image.InputStream.Read(product.ImageData, 0, image.ContentLength);
}
repository.SaveProduct(product);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
以上代码中的 repository.SaveProduct(product);方法实现:
public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
context.SaveChanges();
}
你说要先通过EF从数据库中取出数据,然后更新需要修改的属性,然后context.SaveChanges();
恩,我觉得你说的是对的。但你可能注意到了书中介绍的SaveProduct()是能添加产品和修改产品的。
添加产品是可以的。但修改产品没有效果。这是一本很经典的书,我想作者应该不会犯这样的错误,会不会是我们哪里弄错了。我很想实现这样的功能,因为SaveProduct方法把产品的添加和修改功能集成到一起了。dudu,你能帮我看看这个问题吗?
@Jeffrey.Liang: 在Edit中并没有从数据库中取出数据的代码
首先你给出去的方法是添加一个对象到数据表。并非执行更新操作。如果添加方法没有报错。尝试跟踪查询过程中是否执行了更新相关操作。