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