using System; using System.Linq; using Microsoft.Data.Entity; using Microsoft.Data.Entity.Metadata; using Microsoft.Framework.OptionsModel; namespace MusicStore.Models { public class MusicStoreContext : DbContext { public MusicStoreContext(IServiceProvider serviceProvider, IOptionsAccessor optionsAccessor) : base(serviceProvider, optionsAccessor.Options) { } public DbSet Albums { get; set; } public DbSet Artists { get; set; } public DbSet Orders { get; set; } public DbSet Genres { get; set; } public DbSet CartItems { get; set; } public DbSet OrderDetails { get; set; } protected override void OnModelCreating(ModelBuilder builder) { // TODO: All this configuration needs to be done manually right now. // We can remove this once EF supports the conventions again. builder.Entity().ToTable("Albums"); builder.Entity().ToTable("Artists"); builder.Entity().ToTable("Orders"); builder.Entity().ToTable("Genres"); builder.Entity().ToTable("CartItems"); builder.Entity().ToTable("OrderDetails"); builder.Entity().Key(a => a.AlbumId); builder.Entity().Key(a => a.ArtistId); builder.Entity().Key(o => o.OrderId).StorageName("[Order]"); builder.Entity().Key(g => g.GenreId); builder.Entity().Key(ci => ci.CartItemId); builder.Entity().Key(od => od.OrderDetailId); builder.Entity() .ForeignKeys(kb => { kb.ForeignKey(a => a.GenreId); kb.ForeignKey(a => a.ArtistId); }); builder.Entity() .ForeignKeys(kb => { kb.ForeignKey(a => a.AlbumId); kb.ForeignKey(a => a.OrderId); }); var genre = builder.Model.GetEntityType(typeof(Genre)); var album = builder.Model.GetEntityType(typeof(Album)); var artist = builder.Model.GetEntityType(typeof(Artist)); var orderDetail = builder.Model.GetEntityType(typeof(OrderDetail)); genre.AddNavigation(new Navigation(album.ForeignKeys.Single(k => k.ReferencedEntityType == genre), "Albums", pointsToPrincipal: false)); album.AddNavigation(new Navigation(orderDetail.ForeignKeys.Single(k => k.ReferencedEntityType == album), "OrderDetails", pointsToPrincipal: false)); album.AddNavigation(new Navigation(album.ForeignKeys.Single(k => k.ReferencedEntityType == genre), "Genre", pointsToPrincipal: true)); album.AddNavigation(new Navigation(album.ForeignKeys.Single(k => k.ReferencedEntityType == artist), "Artist", pointsToPrincipal: true)); } } public class MusicStoreDbContextOptions : DbContextOptions { } }