【问题标题】:Saving Byte Array Returns Null Reference保存字节数组返回空引用
【发布时间】:2012-06-19 20:51:55
【问题描述】:

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

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

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

 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; }
    }

照片视图模型

 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; }
    }

【问题讨论】:

  • 究竟是什么 返回 null 或引发 NullReferenceException?请减少代码和更多堆栈。
  • 您意识到每次创建PhotoRepository 的新实例时都会重新初始化该static 字段,对吗?对我来说,这似乎是容易出错且令人困惑的设计
  • 它不是字节数组您正在尝试使用值为空的引用变量。
  • @EdS。啊,我刚注意到。或者,更重要的是,_ctx 可能不会在创建实例之前设置。
  • @pst:是的,也是。 OP,要么_ctxnull,因为你从不创建PhotoRepository 的实例,_ctx.Photosnull,或者你在_ctx.SaveChanges(); 中遇到异常。静态初始化该静态成员(即,当您声明它时)。依赖构造函数来初始化静态数据会遇到奇怪的问题。

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


【解决方案1】:

我认为问题在于_ctx 为空。注意你声明了它和Savestatic,但是_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 一起使用。

【讨论】:

  • 感谢成功,我刚刚删除了静态属性并在调用之前创建了一个新的 PhotoRepository。
  • 好的,很好。确保在处理完一次性物品后立即处理它们(有关一次性 PhotoRepository 的示例,请参阅答案中的我的第二个代码 sn-p)。
  • 谢谢 我想知道在这种情况下如何实现 IDisposable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多