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

ここに画像の説明を入力してください

4

1 に答える 1

1

_ctx問題はそれがnullだと思います。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、別の場所で使用されるためです。

于 2012-06-17T17:57:13.177 に答える