diff --git a/src/MusicStore/Components/CartSummaryComponent.cs b/src/MusicStore/Components/CartSummaryComponent.cs index eccc439aee..0d426e4a11 100644 --- a/src/MusicStore/Components/CartSummaryComponent.cs +++ b/src/MusicStore/Components/CartSummaryComponent.cs @@ -9,7 +9,12 @@ namespace MusicStore.Components [ViewComponent(Name = "CartSummary")] public class CartSummaryComponent : ViewComponent { - private MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public CartSummaryComponent(MusicStoreContext context) + { + db = context; + } public async Task InvokeAsync() { diff --git a/src/MusicStore/Components/GenreMenuComponent.cs b/src/MusicStore/Components/GenreMenuComponent.cs index aa38b5687a..18a98bda99 100644 --- a/src/MusicStore/Components/GenreMenuComponent.cs +++ b/src/MusicStore/Components/GenreMenuComponent.cs @@ -9,7 +9,13 @@ namespace MusicStore.Components [ViewComponent(Name = "GenreMenu")] public class GenreMenuComponent : ViewComponent { - private MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public GenreMenuComponent(MusicStoreContext context) + { + db = context; + } + public async Task InvokeAsync() { // TODO [EF] We don't query related data as yet, so the OrderByDescending isn't doing anything diff --git a/src/MusicStore/Controllers/CheckoutController.cs b/src/MusicStore/Controllers/CheckoutController.cs index 600a48ede8..4cdd4ad801 100644 --- a/src/MusicStore/Controllers/CheckoutController.cs +++ b/src/MusicStore/Controllers/CheckoutController.cs @@ -11,7 +11,13 @@ namespace MusicStore.Controllers //[Authorize] public class CheckoutController : Controller { - MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public CheckoutController(MusicStoreContext context) + { + db = context; + } + const string PromoCode = "FREE"; // diff --git a/src/MusicStore/Controllers/HomeController.cs b/src/MusicStore/Controllers/HomeController.cs index ef86126350..bbfd4733c9 100644 --- a/src/MusicStore/Controllers/HomeController.cs +++ b/src/MusicStore/Controllers/HomeController.cs @@ -7,7 +7,12 @@ namespace MusicStore.Controllers { public class HomeController : Controller { - private MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public HomeController(MusicStoreContext context) + { + db = context; + } // // GET: /Home/ diff --git a/src/MusicStore/Controllers/ShoppingCartController.cs b/src/MusicStore/Controllers/ShoppingCartController.cs index 72a4d834ce..45e2aaab57 100644 --- a/src/MusicStore/Controllers/ShoppingCartController.cs +++ b/src/MusicStore/Controllers/ShoppingCartController.cs @@ -7,7 +7,12 @@ namespace MusicStore.Controllers { public class ShoppingCartController : Controller { - private MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public ShoppingCartController(MusicStoreContext context) + { + db = context; + } // // GET: /ShoppingCart/ diff --git a/src/MusicStore/Controllers/StoreController.cs b/src/MusicStore/Controllers/StoreController.cs index ad04894fa2..22e5d77110 100644 --- a/src/MusicStore/Controllers/StoreController.cs +++ b/src/MusicStore/Controllers/StoreController.cs @@ -6,7 +6,12 @@ namespace MusicStore.Controllers { public class StoreController : Controller { - MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public StoreController(MusicStoreContext context) + { + db = context; + } // // GET: /Store/ diff --git a/src/MusicStore/Controllers/StoreManagerController.cs b/src/MusicStore/Controllers/StoreManagerController.cs index e63511197f..10af0e017c 100644 --- a/src/MusicStore/Controllers/StoreManagerController.cs +++ b/src/MusicStore/Controllers/StoreManagerController.cs @@ -11,7 +11,12 @@ namespace MusicStore.Controllers //[Authorize(Roles="Administrator")] public class StoreManagerController : Controller { - private MusicStoreContext db = new MusicStoreContext(); + private readonly MusicStoreContext db; + + public StoreManagerController(MusicStoreContext context) + { + db = context; + } // // GET: /StoreManager/ diff --git a/src/MusicStore/Models/MusicStoreContext.cs b/src/MusicStore/Models/MusicStoreContext.cs index be38494c46..afd07d8d1b 100644 --- a/src/MusicStore/Models/MusicStoreContext.cs +++ b/src/MusicStore/Models/MusicStoreContext.cs @@ -1,4 +1,5 @@ -using Microsoft.Data.Entity; +using System; +using Microsoft.Data.Entity; using Microsoft.Data.Entity.Metadata; using Microsoft.Data.InMemory; using Microsoft.Data.SqlServer; @@ -7,6 +8,11 @@ namespace MusicStore.Models { public class MusicStoreContext : EntityContext { + public MusicStoreContext(IServiceProvider serviceProvider) + : base(serviceProvider) + { + } + public EntitySet Albums { get; set; } public EntitySet Artists { get; set; } public EntitySet Orders { get; set; } @@ -17,9 +23,9 @@ namespace MusicStore.Models protected override void OnConfiguring(EntityConfigurationBuilder builder) { #if NET45 - builder.UseSqlServer(@"Server=(localdb)\v11.0;Database=MusicStore;Trusted_Connection=True;"); + builder.SqlServerConnectionString(@"Server=(localdb)\v11.0;Database=MusicStore;Trusted_Connection=True;"); #else - builder.UseDataStore(new InMemoryDataStore()); + builder.UseInMemoryStore(persist: true); #endif } diff --git a/src/MusicStore/Models/SampleData.cs b/src/MusicStore/Models/SampleData.cs index e72df99e0b..b73fe4c4f5 100644 --- a/src/MusicStore/Models/SampleData.cs +++ b/src/MusicStore/Models/SampleData.cs @@ -14,9 +14,9 @@ namespace MusicStore.Web.Models { const string imgUrl = "~/Images/placeholder.png"; - public static async Task InitializeMusicStoreDatabaseAsync() + public static async Task InitializeMusicStoreDatabaseAsync(IServiceProvider serviceProvider) { - using (var db = new MusicStoreContext()) + using (var db = new MusicStoreContext(serviceProvider)) { // TODO [EF] Swap to use top level API when available var sqlServerDataStore = db.Configuration.DataStore as SqlServerDataStore; @@ -26,39 +26,41 @@ namespace MusicStore.Web.Models if (!await creator.ExistsAsync()) { await creator.CreateAsync(db.Model); - await InsertTestData(); + await InsertTestData(serviceProvider); } } else { - await InsertTestData(); + await InsertTestData(serviceProvider); } } } - private static async Task InsertTestData() + private static async Task InsertTestData(IServiceProvider serviceProvider) { var genres = GetGenres(); var artists = GetArtists(); var albums = GetAlbums(imgUrl, genres, artists); - await AddOrUpdateAsync(g => g.GenreId, genres); - await AddOrUpdateAsync(a => a.ArtistId, artists); - await AddOrUpdateAsync(a => a.AlbumId, albums); + await AddOrUpdateAsync(serviceProvider, g => g.GenreId, genres); + await AddOrUpdateAsync(serviceProvider, a => a.ArtistId, artists); + await AddOrUpdateAsync(serviceProvider, a => a.AlbumId, albums); } // TODO [EF] This may be replaced by a first class mechanism in EF - private static async Task AddOrUpdateAsync(Func propertyToMatch, IEnumerable entities) + private static async Task AddOrUpdateAsync( + IServiceProvider serviceProvider, + Func propertyToMatch, IEnumerable entities) where TEntity : class { // Query in a separate context so that we can attach existing entities as modified List existingData; - using (var db = new MusicStoreContext()) + using (var db = new MusicStoreContext(serviceProvider)) { existingData = db.Set().ToList(); } - using (var db = new MusicStoreContext()) + using (var db = new MusicStoreContext(serviceProvider)) { foreach (var item in entities) { diff --git a/src/MusicStore/Startup.cs b/src/MusicStore/Startup.cs index 23d81a87da..5438617528 100644 --- a/src/MusicStore/Startup.cs +++ b/src/MusicStore/Startup.cs @@ -13,6 +13,9 @@ using Microsoft.AspNet.Mvc; using Microsoft.AspNet.RequestContainer; using Microsoft.AspNet.Routing; using Microsoft.AspNet.Security.Cookies; +using Microsoft.Data.Entity; +using Microsoft.Data.InMemory; +using Microsoft.Data.SqlServer; using Microsoft.Net.Runtime; using MusicStore.Logging; using MusicStore.Models; @@ -29,6 +32,12 @@ public class Startup { services.AddInstance(new NullLoggerFactory()); services.AddMvc(); +#if NET45 + services.AddEntityFramework(s => s.AddSqlServer()); +#else + services.AddEntityFramework(s => s.AddInMemoryStore()); +#endif + services.AddTransient(); services.AddInstance>(new UserManager(new InMemoryUserStore())); services.AddInstance>(new RoleManager(new InMemoryRoleStore())); }); @@ -55,7 +64,7 @@ public class Startup new { controller = "Home" }); }); - SampleData.InitializeMusicStoreDatabaseAsync().Wait(); + SampleData.InitializeMusicStoreDatabaseAsync(app.ApplicationServices).Wait(); CreateAdminUser(app.ApplicationServices); } diff --git a/src/MusicStore/project.json b/src/MusicStore/project.json index 0f062809fc..e0b24cbb96 100644 --- a/src/MusicStore/project.json +++ b/src/MusicStore/project.json @@ -22,7 +22,7 @@ "Microsoft.AspNet.Identity.Security": "0.1-alpha-*", "Microsoft.Data.Entity": "0.1-alpha-*", "Microsoft.Data.Relational": "0.1-alpha-*", - "Microsoft.Data.SqlServer": "0.1-pre-*", + "Microsoft.Data.SqlServer": "0.1-alpha-*", "Microsoft.Data.InMemory": "0.1-alpha-*", "Microsoft.Data.Migrations": "0.1-alpha-*", "Microsoft.AspNet.Diagnostics": "0.1-alpha-*",