我正在阅读Apress的Pro ASP.NET MVC 3 Framework.我正在关注上传和显示图片的示例.问题是它在将图像上传到产品时工作正常,但如果我以后想要编辑描述然后保存产品图像就会消失.我知道问题在于,在保存产品时我没有传递图像数据,因为图像上传为空,而context.SaveChanges()会保存每个数据字段,包括空图像数据字段.
我被困住了,如果有人能帮助我,我真的很感激!
这是编辑页面的一部分:
<label>Image</label> if (Model.ImageData == null) { @:Null } else { <img id="imageFile" runat="server" src="@Url.Action("Getimage","Product",new { Model.Name })" /> } <label>Upload image:</label> <input type="file" name="Image" runat="server" />
更新时:
public ActionResult Edit(Product product,HttpPostedFileBase image) { if (ModelState.IsValid) { if (image != null && image.ContentLength > 0) { product.ImageMimeType = image.ContentType; product.ImageData = new byte[image.ContentLength]; image.InputStream.Read(product.ImageData,image.ContentLength); } repository.SaveProduct(product); TempData["message"] = string.Format("{0} har sparats",product.Name); return RedirectToAction("Index"); } else { return View(product); } }
保存产品:
public void SaveProduct(Product product) { if (product.ProductID == 0) { context.Products.Add(product); } else { context.Entry(product).State = EntityState.Modified; } int result = context.SaveChanges(); }
解决方法
您对问题的理解是正确的:当您将产品标记为EntityState.Modified EF标记其所有属性都已修改.因此,当您的当前产品来自控制器并且没有图像时,EF会在调用SaveChanges()时将其从DB中删除.
我看到两个选择:
我看到两个选择:
>您加载原始产品并只更新使用EntityState.Modified所需的属性instread:
var productInDb = context.Products.Find(product.Id); productInDb.Name = product.Name; productInDb.Description = product.Description; if (product.ImageData !=null ) { productInDb.ImageData = product.ImageData; productInDb.ImageMimeType = product.ImageMimeType; }
在这种情况下,您必须手动设置产品上的每个属性.
>将产品标记为已修改后,重新设置db中的图像值:
context.Entry(product).State = EntityState.Modified; if (product.ImageData == null) { var databaseValues = context.Entry(product).GetDatabaseValues(); product.ImageData = (byte[])databaseValues["ImageData"]; product.ImageMimeType = (string)databaseValues["ImageMimeType"]; }
对于这两种实现,在更新期间无法删除ImageData.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。