@M-Misha-M
горе-junior, программирую на C#, изучаю .Net

Как избежать ошибки в отношении 1: 0..1 в Entity Framework??

Здравствуйте, моя задача состоит в том, что я вытягиваю путь изображения из БД и отображаю его на странице, само изображение храниться в файловой системе. Вот моя модель 1: 0..1
public class Album
    {

      
        public string Title { get; set; }
        public virtual Genre Genre { get; set; }

        public virtual ICollection<FileDetail> FileDetails { get; set; }
       
        [Key]
        public int AlbumId { get; set; }
        [DisplayName("Genre")]
        public int GenreId { get; set; }
        [DisplayName("Artist")]
        public int  ArtistId { get; set; }


        public decimal Price { get; set; }

        [DisplayName("Album Art URL")]
        [StringLength(1024)]
        public string AlbumArtUrl { get; set; }

        public virtual Artist Artist { get; set; }

        public virtual  MainFileDetails MainFileDetails { get; set; }

    }
}
 public class MainFileDetails
    {
        

        public Guid Id { get; set; }
        public string FileName { get; set; }
        public string Extension { get; set; }
        [Key, ForeignKey("Album")]

        public int AlbumId { get; set; }

       
        public virtual Album Album { get; set; }


    }
}

И вот метод Edit в котором мы можем загрузить новое фото :
[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "AlbumId,Title,GenreId,ArtistId,Price,AlbumArtUrl")] Album album)
        {
            if (ModelState.IsValid)
            {
                //New Files
                for (int i = 0; i < Request.Files.Count; i++)
                {
                    var file = Request.Files[i];

                    if (file != null && file.ContentLength > 0)
                    {
                        var fileName = Path.GetFileName(file.FileName);
                        MainFileDetails fileDetail = new MainFileDetails()
                        {
                            FileName = fileName,
                            Extension = Path.GetExtension(fileName),
                            Id = Guid.NewGuid(),
                            AlbumId = album.AlbumId
                        };
                        var path = Path.Combine(Server.MapPath("~/Upload/"), fileDetail.Id + fileDetail.Extension);
                        file.SaveAs(path);


                        db.Entry(fileDetail).State = EntityState.Modified;


                    }
                }

                db.Entry(album).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
            ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
            ViewBag.AlbumId = new SelectList(db.MainFileDetails, "AlbumId", "FileName", album.AlbumId);
            return View(album);
        }

Но есть проблема, дело в том что когда я делал эту связь 1: 0..1 то данные в таблице Albums уже существовали, и вот если например перейти на страницу Edit, с товаром, Id которого не существует в связующей таблице MainFileDetails, то нам не позволяет программа перейти на страницу Edit, так ка выкидывает exception во вьюшке: "object reference not set to an instance of an object", вот тут:
<img src="~/Upload/@(Model.MainFileDetails.Id + Model.MainFileDetails.Extension)" width="240" height="240" />
Если же создавать новый товар, тогда новая запись с ID привяжется к таблице MainFileDetailsи excepption'а не будет. И что тогда делать с уже существующими данными? Мне приходиться вручную в таблице MainFileDetails добавлять данные, чтобы исключений не было, ну ладно у меня записей пару , а если бы было миллион? Что делать в такой ситуации? Спасибо
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
А не лучше ли перед местом, вызывающее exception сделать проверку?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы