我正在尝试保存具有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; }
}
答案 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
一起使用。