ASP.NET save complex entity model

Good afternoon, I am new to ASP.NET and I cannot understand why my code is not working. I have a model:

using System.ComponentModel.DataAnnotations; using System.Drawing; using System.Globalization; namespace WebApp.Models { public class News { public int NewsId { get; set; } public string title { get; set; } public string description { get; set; } public virtual Picture picture { get; set; } public int guid { get; set; } } public class Picture { public int PictureId { get; set; } public byte[] image { get; set; } public int width { get; set; } public int height { get; set; } public int hash { get; set; } } } 

And I'm trying to create new "News" through the message form:

  // POST: News/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(News news, HttpPostedFileBase uploadImage) { if (ModelState.IsValid && uploadImage != null) { byte[] imageData = null; using (var binaryReader = new BinaryReader(uploadImage.InputStream)) { imageData = binaryReader.ReadBytes(uploadImage.ContentLength); } news.picture = new Picture() { hash = 0, image = imageData, width = 0, height = 0 }; db.News.Add(news); db.SaveChanges(); return RedirectToAction("Index"); } return View(news); } 

But when I take data from db, I get an exception from the null pointer: when I call the debugger, I find out that the value of "news.picture" is null. But before db.SaveChanges () it is 100% non-zero. Looks like I'm doing something stupid, bcs. I can not find someone who ran into this problem. thanks.

+5
source share
3 answers

I don’t know why, but when I add virtual property everything works:

 public virtual Picture picture { get; set; } 
0
source

try the following

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(News news, HttpPostedFileBase uploadImage) { if (ModelState.IsValid && uploadImage != null) { byte[] imageData = null; using (var binaryReader = new BinaryReader(uploadImage.InputStream)) { imageData = binaryReader.ReadBytes(uploadImage.ContentLength); } var picture = new Picture() { hash = 0, image = imageData, width = 0, height = 0 }; db.Pictures.Add(picture); // make sure that the picture was tracked by the EF news.picture = picture; db.News.Add(news); db.SaveChanges(); return RedirectToAction("Index"); } return View(news); } 
0
source

I would make the following changes and see if this helps.

 namespace WebApp.Models { public class News { public int Id { get; set; } public string Title { get; set; } public string Description { get; set; } [ForeignKey("Picture")] public int PictureId { get; set; } public virtual Picture Picture { get; set; } // not sure why this is here public int guid { get; set; } } public class Picture { public int Id { get; set; } public byte[] ImageData { get; set; } public string ContentType { get; set; } public int width { get; set; } public int height { get; set; } public int hash { get; set; } } } 

Controller:

 // POST: News/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(NewsDto news, HttpPostedFileBase uploadImage) { if (ModelState.IsValid && uploadImage != null) { var imageData = byte[uploadImage.ContentLength]; using (var binaryReader = new BinaryReader(uploadImage.InputStream)) { imageData = binaryReader.ReadBytes(uploadImage.ContentLength); } var newsEntity = new New { Title = news.Title, Description = news.Description, Picture = new Picture() { ImageData = imageData, ContentType = contentType // I would get that from the HttpPostedFileBase } } // I always wrap my database connections in a using. using (var db = new DbContext()) { db.News.Add(newsEntity); db.SaveChanges(); } return RedirectToAction("Index"); } return View(news); } 
0
source

All Articles