ASP.NET CORE: Ошибка: Object reference not set to an instance of an object
Не могу понять, почему не устанавливается ссылка на обьект с использованием Entity Framework Core.
Мои модели:
public class Album
{
[ScaffoldColumn(false)]
public int AlbumId { get; set; }
[DisplayName("Genre")]
public int GenreId { get; set; }
[DisplayName("Artist")]
public int ArtistId { get; set; }
[StringLength(160)]
public string Title { get; set; }
public decimal Price { get; set; }
[DisplayName("Album Art URL")]
[StringLength(1024)]
public string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
public virtual List<OrderDetail> OrderDetails { get; set; }
}
public class Artist
{
public int ArtistId { get; set; }
public string Name { get; set; }
}
public partial class Genre
{
public int GenreId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Album> Albums { get; set; }
}
Контекст:
public class MusicStoreEntities : DbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Artist> Artist { get; set; }
public DbSet<Cart> Carts { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public MusicStoreEntities(DbContextOptions<MusicStoreEntities> options): base(options)
{
}
}
Код заполнения первоначальными данными:
public static class ModelBuilderExtensions
{
public static void Initialize(MusicStoreEntities entities)
{
entities.Database.EnsureCreated();
if (entities.Genres.Any())
{
return; // DB has been seeded
}
var genres = new Genre[]
{
new Genre { Name = "Rock" },
new Genre { Name = "Jazz" },
new Genre { Name = "Metal" },
new Genre { Name = "Alternative" },
new Genre { Name = "Disco" },
new Genre { Name = "Blues" },
new Genre { Name = "Latin" },
new Genre { Name = "Reggae" },
new Genre { Name = "Pop" },
new Genre { Name = "Classical" }
};
foreach (Genre g in genres)
{
entities.Genres.Add(g);
}
entities.SaveChanges();
var artists = new Artist[]
{
new Artist { Name = "Aaron Copland & London Symphony Orchestra" },
new Artist { Name = "Aaron Goldberg" },
new Artist { Name = "AC/DC" },
new Artist { Name = "Accept" },
new Artist { Name = "Adrian Leaper & Doreen de Feis" },
new Artist { Name = "Aerosmith" },
new Artist { Name = "Aisha Duo" },
};
var albums = new Album[]
{
new Album { Title = "A Copland Celebration, Vol. I", Genre = genres.Single(g => g.Name == "Classical"), Price = 8.99M, Artist = artists.Single(a => a.Name == "Aaron Copland & London Symphony Orchestra"), AlbumArtUrl = $""},
new Album { Title = "Worlds", Genre = genres.Single(g => g.Name == "Jazz"), Price = 8.99M, Artist = artists.Single(a => a.Name == "Aaron Goldberg"), AlbumArtUrl = "/Content/Images/placeholder.gif" },
new Album { Title = "For Those About To Rock We Salute You", Genre = genres.Single(g => g.Name == "Rock"), Price = 8.99M, Artist = artists.Single(a => a.Name == "AC/DC"), AlbumArtUrl = "/Content/Images/placeholder.gif" },
new Album { Title = "Let There Be Rock", Genre = genres.Single(g => g.Name == "Rock"), Price = 8.99M, Artist = artists.Single(a => a.Name == "AC/DC"), AlbumArtUrl = "/Content/Images/placeholder.gif" },
};
foreach (Album a in albums)
{
entities.Albums.Add(a);
}
entities.SaveChanges();
}
}
Ошибка здесь, в методе Details, при откладке переменная album не имеет ссылки на Genre, Artist. В представлении это строка: @Model.Genre.Name выдает ошибку:
NullReferenceException: Object reference not set to an instance of an object.
Другие методы работают. БД полностью заполнена.
public class StoreController : Controller
{
MusicStoreEntities storeDb;
public StoreController(MusicStoreEntities storeDb)
{
this.storeDb = storeDb;
}
public ActionResult Index()
{
var genres = storeDb.Genres.ToList();
return View(genres);
}
// GET: /Store/Browse
public ActionResult Browse(string genre)
{
var genreModel = storeDb.Genres.Include("Albums")
.Single(g => g.Name == genre);
return View(genreModel);
}
// GET: /Store/Details
public ActionResult Details(int id)
{
var album = storeDb.Albums.Find(id);
return View(album);
}
}