EntityFramework SaveChange()方法不能更新的问题
2012-07-06 19:25
260 查看
在练习 《PRO MVC3 Professional》 第9章的实例的时候,碰到一个问题,之前可能看得不是很仔细,还没有注意到这个问题,直到今天添加上传图片的问题才发现不管自己怎么添加,图片都没法添加到数据库里去。后来发现,新加项目的时候是可以的,只是编辑更新的时候不行,郁闷了大半个下午,终于在网上找到了正确的解决方法,原来老美写的教科书也会有错误。。。看来还真是尽信书不如无书。
例子是书里的一个SportsStore实例,更新的方法在AdminController里
代码:
[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);
}
try
{
repository.SaveProduct(product);
}
catch (Exception ex)
{
throw ex;
}
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
这段代码没有问题,有问题的是下面这段代码:
书中的代码是没有注释的那几行的,因为Product没有改变,数据库因此没有更新。必须去掉注释行,告诉context,Product的内容已经发生改变,才能正常地更新到数据库里。
-------------------分割线----------------------------------
在研究这个问题的时候,不经意间发现了EntityFramework的几个新特性:
1.可以事先定义好实体类,上面例子中比如说是Product类,
数据库可以事先不用创建,写好连接字符串,配置好配置文件
可以在Package Manger Console 窗口中,输入以下命令:
Update to Database
就可以让EntityFamework自动创建(更新)数据库文件,很强大!!!
例子是书里的一个SportsStore实例,更新的方法在AdminController里
代码:
[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);
}
try
{
repository.SaveProduct(product);
}
catch (Exception ex)
{
throw ex;
}
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
这段代码没有问题,有问题的是下面这段代码:
public class EFProductRepository : IProductsRespository { private EFDbContext context = new EFDbContext(); public IQueryable<Product> Products { get { return context.Products; } } public void SaveProduct(Product product) { if (product.ProductID == 0) { context.Products.Add(product); } //else // { // context.Entry(product).State = System.Data.EntityState.Modified; // } context.SaveChanges(); } #region IProductsRespository 成员 public void DeleteProduct(Product product) { context.Products.Remove(product); context.SaveChanges(); } #endregion }
书中的代码是没有注释的那几行的,因为Product没有改变,数据库因此没有更新。必须去掉注释行,告诉context,Product的内容已经发生改变,才能正常地更新到数据库里。
-------------------分割线----------------------------------
在研究这个问题的时候,不经意间发现了EntityFramework的几个新特性:
1.可以事先定义好实体类,上面例子中比如说是Product类,
public class Product { [HiddenInput(DisplayValue=false)] public int ProductID { get; set; } [Required(ErrorMessage="Please enter a product name")] public string Name { get; set; } [Required(ErrorMessage="Please enter a description")] [DataType(DataType.MultilineText)] public string Description { get; set; } [Required] [Range(0.01,double.MaxValue,ErrorMessage="Please enter a positive price")] public decimal Price { get; set; } [Required(ErrorMessage="Please specify a category")] public string Category { get; set; } public byte[] ImageData { get; set; } [HiddenInput(DisplayValue = false)] public string ImageMimeType { get; set; } }
数据库可以事先不用创建,写好连接字符串,配置好配置文件
可以在Package Manger Console 窗口中,输入以下命令:
Update to Database
就可以让EntityFamework自动创建(更新)数据库文件,很强大!!!
相关文章推荐
- android studio 不能更新问题解决方法
- Win10更新后出现vc++6.0不能用的问题解决方法
- EF更新错误:一个实体对象不能由多个 IEntityChangeTracker 实例引用
- appframework学习--appframework开发常见问题及解决方法(不定期更新)
- Thinkphp Save方法更新问题
- appframework学习--appframework开发常见问题及解决方法(不定期更新)
- Entity Framework Code First 遭遇mapping 不能识别map类问题
- 有关ubuntu下面更新后有线不能上网的问题的解决方法
- 多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)
- ADO.NET Entity framework 中 实体的对应数据库中text类型的问题 (更新) :asp.net entity 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 3 ("@0"): 数据类型 0
- 【一个实体对象不能由多个 IEntityChangeTracker 实例引用】原因及解决方法
- 在使用ThinkPHP时候数据更新的时候,save()方法返回值为0的问题!!!!
- 转:iTunes10.7更新,xCode 安装Mobile Device Framework出错的问题的解决方法
- iTunes10.7更新,xCode 安装Mobile Device Framework出错的问题的解决方法
- 解决Android SDK和Android Studio不能更新的问题(终极解决方法)
- Linux--14:ubuntu12.04 vi不能正常使用、右上角出现红杠提醒更新出问题、网速比相同条件下windows下慢 解决方法
- 解决TextView数据不能更新的问题以及Android Button事件响应函数的两种方法
- 在MVC中更新Model-First Entity Framework POCO实体外键的方法
- 使用LitePalFramework/LitePal,调用save方法,数据插入不成功的细节问题
- THinkphp save方法 判断如果没有数据更新 报错问题