Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存字节数组返回空引用_C#_Asp.net Mvc_Entity Framework_File Upload_Bytearray - Fatal编程技术网

C# 保存字节数组返回空引用

C# 保存字节数组返回空引用,c#,asp.net-mvc,entity-framework,file-upload,bytearray,C#,Asp.net Mvc,Entity Framework,File Upload,Bytearray,我正试图保存我的Photo类,它有一个byte[]文件字段。尝试使用上下文保存时抛出错误 对象引用未设置为对象的实例 但在调试时,我可以看到它不是空的。我可以看到类的所有属性,包括字节数组中的值 public class PhotoRepository { private static BlogContext _ctx; public PhotoRepository() { _ctx = new BlogCon

我正试图保存我的
Photo
类,它有一个
byte[]文件
字段。尝试使用上下文保存时抛出错误

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

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

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

我认为问题在于
\u ctx
为空。请注意,您声明它并
保存
静态
,但是
\u ctx
仅在
公共Photopository()
中实例化,后者是构造函数。只要它确实应该是静态的,就静态地实例化它,而不是在构造函数中实例化:

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

然后,在使用完感光材料后,一定要将其处理掉。我在这里建议更改的原因是,
BlogContext
是一次性的,并且在另一个地方与
using
一起使用。

到底是什么返回了
null
或引发了null引用异常?请减少代码,增加堆栈。您意识到每次创建新的
photopository
实例时,都会重新初始化该静态字段,对吗?这看起来像是一个容易出错且令人困惑的设计,而不是字节数组。您正试图使用一个值为null的引用变量。@EdS。啊,我刚才注意到了。或者,更重要的是,在创建实例之前,可能不会设置
\u ctx
。@pst:Yep,也是这样。OP,要么
\u ctx
null
,因为您从未创建
Photopository
的实例,
\u ctx.Photos
null
,要么您在
\u ctx.SaveChanges()中得到异常。静态初始化该静态成员(即,当您声明它时)。依赖构造函数初始化静态数据会遇到奇怪的问题。多亏了它,我才删除了static属性并在调用之前创建了一个新的Photopository。好的,很好。请确保在处理完一次性的东西后立即处理它们(请参阅答案中的第二段代码片段,以获取一次性光电存储的示例)。谢谢,我想知道在这种情况下如何实现IDisposable
 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(); }
    }