zoukankan      html  css  js  c++  java
  • EntityFramework SaveChange()方法不能更新的问题 Kevin

    在练习 《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);
    }
    }

    这段代码没有问题,有问题的是下面这段代码:

     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自动创建(更新)数据库文件,很强大!!!

  • 相关阅读:
    javascript变量作用域、匿名函数及闭包
    SenchaTouch2中navigation下嵌入list无事件响应问题解决
    Fedora17安装SSH
    25个必须记住的SSH命令
    linux下安装hadoop
    Fedora17实现图形界面root登录
    virtualBox利用已创建的vdi文件克隆快速创建新虚拟机
    printf/scanf格式修饰符
    windowsServer2003服务器上修改ftp端口号
    为ckeditor添加行距的功能(转载)
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2579909.html
Copyright © 2011-2022 走看看