【发布时间】: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,要么
_ctx是null,因为你从不创建PhotoRepository的实例,_ctx.Photos是null,或者你在_ctx.SaveChanges();中遇到异常。静态初始化该静态成员(即,当您声明它时)。依赖构造函数来初始化静态数据会遇到奇怪的问题。
标签: c# asp.net-mvc entity-framework file-upload bytearray