保存字节数组返回空引用

时间:2012-06-17 17:45:39

标签: c# asp.net-mvc entity-framework file-upload bytearray

我正在尝试保存具有Photo字段的byte[] File类。当尝试使用上下文保存它时会抛出错误

  

对象引用未设置为对象的实例。

但是在调试时我可以看到它不是null。我可以看到该类的所有属性,包括字节数组中的值。

 public class PhotoRepository 
    {
        private static BlogContext _ctx;

        public PhotoRepository()
        {
            _ctx = new BlogContext();
        }

        public static void Save(Photo p)
        {
            _ctx.Photos.Add(p);
            _ctx.SaveChanges();
        }
    }

控制器

 public class PhotoController : Controller
    {
        public ActionResult Index()
        {
            using (var ctx = new BlogContext())
            {
                return View(ctx.Photos.AsEnumerable());
            }
        }

        public ActionResult Upload()
        {
            return View(new Photo());
        }

        [HttpPost]
        public ActionResult Upload(PhotoViewModel model)
        {
            var photo =  new Photo();//Mapper.Map<PhotoViewModel, Photo>(model);
            if (ModelState.IsValid)
            {

                photo.AlternateText = model.AlternateText;
                photo.Description = model.Description;
                photo.File = MapStreamToFile(model.File);
                photo.Name = model.Name;
                PhotoRepository.Save(photo);
                return RedirectToAction("Index");
            }
            return View(photo);
        }

        public byte[] MapStreamToFile(HttpPostedFileBase file)
        {
            using (var stream = file.InputStream)
            {
                var memoryStream = stream as MemoryStream;
                if (memoryStream == null)
                {
                    memoryStream = new MemoryStream();
                    stream.CopyTo(memoryStream);
                }
                return memoryStream.ToArray();
            }
        }
    }

照片

 public class Photo
    {
        public int Id { get; set; }

        public Byte[] File { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public string AlternateText { get; set; }
    }

PhotoViewModel

 public class PhotoViewModel
    {
        public int Id { get; set; }

        public HttpPostedFileBase File { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public string AlternateText { get; set; }
    }

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为问题是_ctx为空。请注意,您声明了它Save static,但_ctx仅在public PhotoRepository()中实例化,这是构造函数。只要它应该是静态的,静态地实例化它而不是在构造函数中:

 public static class PhotoRepository 
    {
        private static BlogContext _ctx = new BlogContext();

        public static void Save(Photo p)
        {
            _ctx.Photos.Add(p);
            _ctx.SaveChanges();
        }
    }

我还将类更改为static,因为我只看到它包含静态成员。如果您打算在本课程中学习更多内容,这可能不正确。

编辑:(感谢@pst)我从更多地查看您的代码看到,我认为这可能是一个更好的设计:

 public class PhotoRepository : IDisposable
    {
        private BlogContext _ctx = new BlogContext();

        public void Save(Photo p)
        {
            _ctx.Photos.Add(p);
            _ctx.SaveChanges();
        }

        void IDisposable.Dispose() { _ctx.Dispose(); }
    }

然后务必在完成后处理PhotoRepository。我建议更改的原因是BlogContext是一次性的,并且在另一个地方与using一起使用。