2012-06-17 3 views
0

Я пытаюсь сохранить класс 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; } 
    } 

enter image description here

+0

* Точно, что * возвращает 'null' или вызывает исключение NullReferenceException? Меньше кода и больше стека, пожалуйста. –

+1

Вы понимаете, что каждый раз, когда вы создаете новый экземпляр «PhotoRepository», вы повторно инициализируете это * статическое поле, верно? Это похоже на ошибку и смущает дизайн для меня –

+0

его не байтовый массив. Вы пытаетесь использовать ссылочную переменную, значение которой равно null. – MMK

ответ

1

Я думаю, проблема в том, что _ctx - null. Обратите внимание, что вы объявляете его и 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, так как я вижу только он содержит статические члены. Это может быть неверно, если вы планируете больше для этого класса.

Edit: (спасибо @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 в другом месте.

+0

Или устраните использование 'static' ... –

+0

Спасибо, что сработало, я просто удалил статическое свойство и создал новый PhotoRepository перед вызовом. –

+1

Хорошо, хорошо. Обязательно удаляйте вещи, которые можно использовать сразу, как только вы закончите с ними (см. Мой второй фрагмент кода в ответе на примере одноразового PhotoRepository). –

Смежные вопросы