Asp.net mvc 4 如何在编辑时保留varbinary类型的图像数据?

Asp.net mvc 4 如何在编辑时保留varbinary类型的图像数据?,asp.net-mvc-4,visual-studio-2012,binary-data,entity-framework-5,razor-2,Asp.net Mvc 4,Visual Studio 2012,Binary Data,Entity Framework 5,Razor 2,我有一个小的演示应用程序来处理存储在数据库中的二进制数据。相关代码见下文: 实体类: [HiddenInput(DisplayValue = false)] public int Id { get; set; } [Display(Name = "Full Name:")] public string Name { get; set; } [DataType(DataType.Upload)] [Display(Name = "Photo:"

我有一个小的演示应用程序来处理存储在数据库中的二进制数据。相关代码见下文:

实体类:

    [HiddenInput(DisplayValue = false)]
    public int Id { get; set; }

    [Display(Name = "Full Name:")]
    public string Name { get; set; } 

    [DataType(DataType.Upload)]
    [Display(Name = "Photo:")]
    public byte[] ImageData { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string ImageMimeType { get; set; }
   [HttpGet]
   public ActionResult Edit(int id)
    {
         var mensPlayer = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);

        return View(mensPlayer);
    }

    [HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer, HttpPostedFileBase image)
    {
        if (ModelState.IsValid)
        {
           //Added line below
            _dataSource.ImageTemp(mensPlayerInDb, mensPlayer);
            if (image != null)
            {
                mensPlayer.ImageMimeType = image.ContentType;
                mensPlayer.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(mensPlayer.ImageData, 0, image.ContentLength);
            }
              //Added line below
             mensPlayer.ImageData = mensPlayerInDb.ImageData;

            //Save Player
            _dataSource.Update(mensPlayer);
           _dataSource.Save();
          TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }
public FileContentResult GetImage(int id)
    {
        var image = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);
        if (image != null)
        {
            return File(image.ImageData, image.ImageMimeType);
        }
        return null;
    }
编辑操作:

    [HiddenInput(DisplayValue = false)]
    public int Id { get; set; }

    [Display(Name = "Full Name:")]
    public string Name { get; set; } 

    [DataType(DataType.Upload)]
    [Display(Name = "Photo:")]
    public byte[] ImageData { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string ImageMimeType { get; set; }
   [HttpGet]
   public ActionResult Edit(int id)
    {
         var mensPlayer = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);

        return View(mensPlayer);
    }

    [HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer, HttpPostedFileBase image)
    {
        if (ModelState.IsValid)
        {
           //Added line below
            _dataSource.ImageTemp(mensPlayerInDb, mensPlayer);
            if (image != null)
            {
                mensPlayer.ImageMimeType = image.ContentType;
                mensPlayer.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(mensPlayer.ImageData, 0, image.ContentLength);
            }
              //Added line below
             mensPlayer.ImageData = mensPlayerInDb.ImageData;

            //Save Player
            _dataSource.Update(mensPlayer);
           _dataSource.Save();
          TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }
public FileContentResult GetImage(int id)
    {
        var image = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);
        if (image != null)
        {
            return File(image.ImageData, image.ImageMimeType);
        }
        return null;
    }
GetImage方法:

    [HiddenInput(DisplayValue = false)]
    public int Id { get; set; }

    [Display(Name = "Full Name:")]
    public string Name { get; set; } 

    [DataType(DataType.Upload)]
    [Display(Name = "Photo:")]
    public byte[] ImageData { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string ImageMimeType { get; set; }
   [HttpGet]
   public ActionResult Edit(int id)
    {
         var mensPlayer = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);

        return View(mensPlayer);
    }

    [HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer, HttpPostedFileBase image)
    {
        if (ModelState.IsValid)
        {
           //Added line below
            _dataSource.ImageTemp(mensPlayerInDb, mensPlayer);
            if (image != null)
            {
                mensPlayer.ImageMimeType = image.ContentType;
                mensPlayer.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(mensPlayer.ImageData, 0, image.ContentLength);
            }
              //Added line below
             mensPlayer.ImageData = mensPlayerInDb.ImageData;

            //Save Player
            _dataSource.Update(mensPlayer);
           _dataSource.Save();
          TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }
public FileContentResult GetImage(int id)
    {
        var image = _dataSource.MensPlayers.FirstOrDefault(p => p.Id == id);
        if (image != null)
        {
            return File(image.ImageData, image.ImageMimeType);
        }
        return null;
    }
显示图像:

@if (Model.ImageData != null) {
    <div >
         <img width="300" height="400" src="@Url.Action("GetImage", "MensPlayer",
                                        new { Model.Id })" alt="Player Image"/>
     </div>
 }
我的问题是,每次我尝试编辑播放器时,都会从数据库中很好地检索到所有数据,但当我在编辑后点击save时,ImageData就会丢失,更像是用空值替换原始数据。就像,应用程序希望我在每次尝试编辑时重新上传图像一样


我能做些什么来清理这个?

好吧,如果
image
null
那么在你的实体
mensPlayer.ImageData
null
。稍后当您调用
\u dataSource.Update(mensPlayer)
时,您将实体的状态设置为
Modified
(至少我猜
Update
只是将状态设置为
Modified
),因此您告诉EF您也修改了图像(即将其设置为
null
),EF将保存该更改

为了解决这个问题,您可以先从数据库加载包含图像的实体

var mensPlayerInDb = context.MensPlayers.Find(mensPlayer.Id);
mensPlayer.ImageData = mensPlayerInDb.ImageData; // save the ImageData
// copy changed values to loaded entity and save it, ImageData is unchanged
context.Entry(mensPlayerInDb).CurrentValues.SetValues(mensPlayer);
context.SaveChanges();
…或者您可以尝试:

context.Entry(mensPlayer).State = EntityState.Modified;
context.Entry(mensPlayer).Property(m => m.ImageData).IsModified = false;
后一种方法不适用于EF<5.0(因为一旦实体被标记为
Modified
,禁止将属性的
Modified
状态设置为
false
),但它应该适用于EF 5


您需要将其中一个解决方案集成到您的
\u数据源
服务类中,可能需要引入新方法,因为它与您的常规
更新
方法不兼容。

对不起,我在生活中遇到了一些问题,但我又回来了。第二个选项看起来很容易实现,但由于第一行将所有内容都设置为“修改”,因此出现了一个错误。在第一个选项中,我了解代码的归档内容,但在实现解决方案时遇到了困难。查看并建议我是否在正确的轨道上。@KomengeMwandila:但是您没有在任何地方使用
ImageTemp
,也没有从数据库加载原始图像,是吗?我已经更新了编辑操作。但有一个问题,这行代码是否必要:
var mensplayerdb=context.MensPlayers.Find(mensPlayer.Id)当我有这行代码时:
var model=\u dataSource.MensPlayers.Single(p=>p.Id==Id)在我的HttpGet中?我很难理解那行代码中使用的Find属性?当我build@KomengeMwandila:您也可以使用
Single
。您没有
Find
,因为在您的_数据源
MensPlayer
中是
IQueryabl
而不是
DbSet