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, IOptions 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( b => { b.Key(o => o.OrderId); b.Property(o => o.OrderId) .ColumnName("[Order]"); }); builder.Entity().Key(g => g.GenreId); builder.Entity().Key(ci => ci.CartItemId); builder.Entity().Key(od => od.OrderDetailId); // TODO: Remove this when we start using auto generated values builder.Entity().Property(a => a.ArtistId).GenerateValuesOnAdd(generateValues: false); builder.Entity().Property(a => a.ArtistId).GenerateValuesOnAdd(generateValues: false); builder.Entity().Property(g => g.GenreId).GenerateValuesOnAdd(generateValues: false); builder.Entity(b => { b.ForeignKey(a => a.GenreId); b.ForeignKey(a => a.ArtistId); }); builder.Entity(b => { b.ForeignKey(a => a.AlbumId); b.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("Albums", album.ForeignKeys.Single(k => k.ReferencedEntityType == genre), pointsToPrincipal: false); album.AddNavigation("OrderDetails", orderDetail.ForeignKeys.Single(k => k.ReferencedEntityType == album), pointsToPrincipal: false); album.AddNavigation("Genre", album.ForeignKeys.Single(k => k.ReferencedEntityType == genre), pointsToPrincipal: true); album.AddNavigation("Artist", album.ForeignKeys.Single(k => k.ReferencedEntityType == artist), pointsToPrincipal: true); } } public class MusicStoreDbContextOptions : DbContextOptions { } }