NullReferenceException: Object reference not set to an instance of an object. .Net MVC

0

Czesc, Po wejsciu na ponizszy widok wyrzuca mi NullReferenceException, dokladnie na

<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl1">

Co jest nie tak w tej linijce ?

Widok:


@model Samochod

<head>
    <link href="lib/bootstrap/css/bootstrap.css" rel="stylesheet" />
    <link href="content/style.css" rel="stylesheet" />
    <link href="https://fonts.googleapis.com/css?family=Bitter" rel="stylesheet">

</head>

<html>
<body>

<div class="container" id="detailsContainer">
    <div class="row">
        <div class="col-sm">
            <div id="carouselExampleControls" class="carousel slide" data-interval="false" data-ride="carousel">
                <ol class="carousel-indicators">
                    <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="3"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="4"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="5"></li>
                    <li data-target="#carouselExampleIndicators" data-slide-to="6"></li>
                </ol>
                <div class="carousel-inner">
                    <div class="carousel-item active">
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl1">*@
                        <img class="d-block" src="@Model.Zdjecia.ZdjecieUrl1">
                    </div>
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl2">*@
                        <img class="d-block" src="@Model.Zdjecia.ZdjecieUrl2">
                    </div>
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl3">*@
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl4">*@
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl5">*@
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>
                </div>
                <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
                    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                    <span class="sr-only">Previous</span>
                </a>
                <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
                    <span class="carousel-control-next-icon" aria-hidden="true"></span>
                    <span class="sr-only">Next</span>
                </a>
            </div>
        </div>
        <div class="col-sm">
                        <h1>@Model.Marka - @Model.Model</h1>
                <div class="caption-full">
                    <h4>Rocznik: @Model.RokProdukcji</h4>
                    <h4>Przebieg: @Model.Przebieg</h4>
                    <h4>Pojemnosc: @Model.Pojemnosc</h4>
                    <h4>Moc: @Model.Moc</h4>
                    <h4>Cena: @Model.Cena zł</h4>
                    <h4>@Model.Opis</h4>
                </div>
        </div>
    </div>
</div>

</body>
</html>

Modele:


using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Komis.Models
{
    [Table("Samochody")]
    public class Samochod
    {
        [Key]
        public int SamochodId { get; set; }
        public string Marka { get; set; }
        public string Model { get; set; }
        public int RokProdukcji { get; set; }
        public string Przebieg { get; set; }
        public string Pojemnosc { get; set; }
        public string RodzajPaliwa { get; set; }
        public string Moc { get; set; }
        public string Opis { get; set; }
        public decimal Cena { get; set; }
        public string ZdjecieUrl { get; set; }
        public string MiniaturkaUrl { get; set; }
        public bool JestSamochodemTygodnia { get; set; }
        public bool JestWCentrali { get; set; }
        //relacja jeden do jeden
        public virtual Zdjecie Zdjecia { get; set; }
    }
}

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Komis.Models
{
    [Table("Zdjecia")]
    public class Zdjecie
    {
        [Key]
        public int Id { get; set; }
        [ForeignKey("Samochody")]
        public int SamochodId { get; set; }
        public string ZdjecieUrl1 { get; set; }
        public string ZdjecieUrl2 { get; set; }
        public string ZdjecieUrl3 { get; set; }
        public string ZdjecieUrl4 { get; set; }
        public string ZdjecieUrl5 { get; set; }
        // relacja jeden do jeden
        public virtual Samochod Samochody { get; set; }
    }
}

Kontroler:

using System.Linq;
using Komis.Models;
using Komis.ViewModels;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace Komis.Controllers
{
    public class HomeController : Controller
    {
        private readonly ISamochodRepository _samochodRepository;

        public HomeController(ISamochodRepository samochodRepository)
        {
            _samochodRepository = samochodRepository;
            // _samochodRepository = new MockSamochodRepository();  Gdybysmy nie korzystali z wstrzykiwania zaleznosci
        }

        // GET: /<controller>/
        public IActionResult Index()
        {
            var samochody = _samochodRepository.PobierzWszystkieSamochody().OrderBy(s => s.Marka);  //Pobieramy tutaj samochody

            var homeVM = new HomeVM()
            {
                Tytul = "Przeglad Samochodow",
                Samochody = samochody.ToList()
            };

            return View(homeVM);
        }

        public IActionResult Szczegoly(int id)  //Metoda do pokazywanie szczegolow auta o danym id
        {
            var samochod = _samochodRepository.PobierzSamochodOId(id);

            if (samochod == null)
                return NotFound();  //Nie znaleziono samochodu

            return View(samochod);
        }
    }
}
1

A masz jakieś "Zdjecia" w tych swoich danych?
Obstawiam że Model.Zdjecia jest nullem.

Jeżeli twoje repo pobiera dane z DB i masz te zdjęcia. To idę o zakład że w PobierzWszystkieSamochody nie robisz join'a lub robisz go źle.

0

No jest nullem bo sprawdzilem to debuggerem ale nwm jak to zmienic, no bo pod ta zmienna nie wpisuje nic do dazy danych bo sluzy mi tylko ona do relacji miedzy tabelami. Moge to jakos zmienic ?

1

To może pokaż kod tego repozytorium?
Korzystasz z code first czy z database first?

0

Wydaje mi sie, ze z Code First. Jest to moj pierwszy samodzielny projekty w tej platformie stad sory za jakies glupie bledy

using System.Collections.Generic;
using System.Linq;

namespace Komis.Models
{
    public class SamochodRepository : ISamochodRepository
    {
        private readonly AppDbContext _appDbContext;

        public SamochodRepository(AppDbContext appDbContext)
        {
            _appDbContext = appDbContext; 
        }

        public Samochod PobierzSamochodOId(int samochodId)
        {
            return _appDbContext.Samochody.FirstOrDefault(s => s.SamochodId == samochodId);
        }

        public IEnumerable<Samochod> PobierzWszystkieSamochody()
        {
            return _appDbContext.Samochody;
        }

        public void DodajSamochod(Samochod samochod)
        {
            _appDbContext.Samochody.Add(samochod);
            _appDbContext.SaveChanges();    //Zapis do bazy danych
        }

        public void EdytujSamochod(Samochod samochod)
        {
            _appDbContext.Samochody.Update(samochod);
            _appDbContext.SaveChanges();
        }

        public void UsunSamochod(Samochod samochod)
        {
            _appDbContext.Samochody.Remove(samochod);
            _appDbContext.SaveChanges();
        }
    }
}
1

Ok, więc tak..
W modelach zamiast public virtual Zdjecie Zdjecia { get; set; } powinno być public virtual ICollection<Zdjecie> Zdjecia { get; set; }
Potem trzeba wywalić:

        public string ZdjecieUrl1 { get; set; }
        public string ZdjecieUrl2 { get; set; }
        public string ZdjecieUrl3 { get; set; }
        public string ZdjecieUrl4 { get; set; }
        public string ZdjecieUrl5 { get; set; }

I zastąpić to:

        public string ZdjecieUrl { get; set; }

Bo to co zrobiłeś jest nie mniej nie więcej jak ograniczające..

Dalej.. Repo:

        public IEnumerable<Samochod> PobierzWszystkieSamochody()
        {
            return _appDbContext.Samochody;
        }

Zastąp:

        public IEnumerable<Samochod> PobierzWszystkieSamochody()
        {
            return _appDbContext.Samochody.Include(e => e.Zdjecia);
        }

Na samym końcu powinieneś ładować poniższy kod z pętli:

                    <div class="carousel-item ">
                        @*<img class="d-block" src="@Model.Zdjecia.ZdjecieUrl5">*@
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>

Czyli coś w rodzaju:

@foreach(var photo in Model.Zdjecia) {
                    <div class="carousel-item ">
                        @*<img class="d-block" src="@photo .ZdjecieUrl">*@
                        <img class="d-block" src="@Model.MiniaturkaUrl">
                    </div>
}
0

Tylko te ZdjeciaUrl mialy sie roznic a teraz jak jest jedna properta to jak mam je wpisac do db ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1