Use OnModelCreating & OnConfiguring (plus some other cleanup)
Swapping context to use OnModelCreating & OnConfiguring now that models are cached Adding some [Required] annotations to properties that are really required in the domain model Renaming Cart => CartItem because that's what it really is :) Allowing database to hold some null data now that we can materialize it (although we can't save it yet)
This commit is contained in:
parent
965046813e
commit
fe9770cc80
|
|
@ -64,7 +64,7 @@ namespace MusicStore.Controllers
|
|||
|
||||
// Get the name of the album to display confirmation
|
||||
// TODO [EF] Turn into one query once query of related data is enabled
|
||||
int albumId = db.Carts.Single(item => item.RecordId == id).AlbumId;
|
||||
int albumId = db.Carts.Single(item => item.CartItemId == id).AlbumId;
|
||||
string albumName = db.Albums.Single(a => a.AlbumId == albumId).Title;
|
||||
|
||||
// Remove from cart
|
||||
|
|
|
|||
|
|
@ -19,10 +19,7 @@ namespace MusicStore.Controllers
|
|||
|
||||
public IActionResult Index()
|
||||
{
|
||||
//Bug: Include needs EF.
|
||||
//var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist)
|
||||
// .OrderBy(a => a.Price);
|
||||
|
||||
// TODO [EF] Swap to native support for loading related data when available
|
||||
var albums = db.Albums;
|
||||
foreach (var album in albums)
|
||||
{
|
||||
|
|
@ -38,8 +35,6 @@ namespace MusicStore.Controllers
|
|||
|
||||
public IActionResult Details(int id = 0)
|
||||
{
|
||||
//Bug: Find needs EF
|
||||
//Album album = db.Albums.Find(id);
|
||||
Album album = db.Albums.Single(a => a.AlbumId == id);
|
||||
if (album == null)
|
||||
{
|
||||
|
|
@ -86,8 +81,6 @@ namespace MusicStore.Controllers
|
|||
|
||||
public IActionResult Edit(int id = 0)
|
||||
{
|
||||
//Bug: Need EF to implement Find
|
||||
//Album album = db.Albums.Find(id);
|
||||
Album album = db.Albums.Single(a => a.AlbumId == id);
|
||||
|
||||
if (album == null)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,14 @@
|
|||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
||||
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace MusicStore.Models
|
||||
{
|
||||
public class Artist
|
||||
{
|
||||
public int ArtistId { get; set; }
|
||||
|
||||
[Required]
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -5,10 +5,11 @@ using System.ComponentModel.DataAnnotations;
|
|||
|
||||
namespace MusicStore.Models
|
||||
{
|
||||
public class Cart
|
||||
public class CartItem
|
||||
{
|
||||
[Key]
|
||||
public int RecordId { get; set; }
|
||||
public int CartItemId { get; set; }
|
||||
|
||||
[Required]
|
||||
public string CartId { get; set; }
|
||||
public int AlbumId { get; set; }
|
||||
public int Count { get; set; }
|
||||
|
|
@ -1,12 +1,15 @@
|
|||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace MusicStore.Models
|
||||
{
|
||||
public class Genre
|
||||
{
|
||||
public int GenreId { get; set; }
|
||||
|
||||
[Required]
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public List<Album> Albums { get; set; }
|
||||
|
|
|
|||
|
|
@ -9,49 +9,30 @@ namespace MusicStore.Models
|
|||
{
|
||||
public class MusicStoreContext : EntityContext
|
||||
{
|
||||
private static EntityConfiguration _config;
|
||||
|
||||
public EntitySet<Album> Albums { get; set; }
|
||||
public EntitySet<Artist> Artists { get; set; }
|
||||
public EntitySet<Order> Orders { get; set; }
|
||||
public EntitySet<Genre> Genres { get; set; }
|
||||
public EntitySet<Cart> Carts { get; set; }
|
||||
public EntitySet<CartItem> Carts { get; set; }
|
||||
public EntitySet<OrderDetail> OrderDetails { get; set; }
|
||||
|
||||
public MusicStoreContext()
|
||||
: base(GetConfiguration())
|
||||
{ }
|
||||
|
||||
// TODO Not using OnModelCreating and OnConfiguring because model is not cached and that breaks InMemoryDataStore
|
||||
// because IEntityType is a different instance for the same type between context instances
|
||||
private static EntityConfiguration GetConfiguration()
|
||||
protected override void OnConfiguring(EntityConfigurationBuilder builder)
|
||||
{
|
||||
if (_config == null)
|
||||
{
|
||||
var model = new Model();
|
||||
var modelBuilder = new ModelBuilder(model);
|
||||
modelBuilder.Entity<Album>().Key(a => a.AlbumId);
|
||||
modelBuilder.Entity<Artist>().Key(a => a.ArtistId);
|
||||
modelBuilder.Entity<Order>().Key(o => o.OrderId).StorageName("[Order]");
|
||||
modelBuilder.Entity<Genre>().Key(g => g.GenreId);
|
||||
modelBuilder.Entity<Cart>().Key(c => c.RecordId);
|
||||
modelBuilder.Entity<OrderDetail>().Key(o => o.OrderDetailId);
|
||||
new SimpleTemporaryConvention().Apply(model);
|
||||
|
||||
var builder = new EntityConfigurationBuilder();
|
||||
|
||||
// TODO [EF] Remove once SQL Client is available on K10
|
||||
#if NET45
|
||||
builder.UseSqlServer(@"Server=(localdb)\v11.0;Database=MusicStore;Trusted_Connection=True;");
|
||||
builder.UseSqlServer(@"Server=(localdb)\v11.0;Database=MusicStore;Trusted_Connection=True;");
|
||||
#else
|
||||
builder.UseDataStore(new InMemoryDataStore());
|
||||
builder.UseDataStore(new InMemoryDataStore());
|
||||
#endif
|
||||
builder.UseModel(model);
|
||||
}
|
||||
|
||||
_config = builder.BuildConfiguration();
|
||||
}
|
||||
|
||||
return _config;
|
||||
protected override void OnModelCreating(ModelBuilder builder)
|
||||
{
|
||||
builder.Entity<Album>().Key(a => a.AlbumId);
|
||||
builder.Entity<Artist>().Key(a => a.ArtistId);
|
||||
builder.Entity<Order>().Key(o => o.OrderId).StorageName("[Order]");
|
||||
builder.Entity<Genre>().Key(g => g.GenreId);
|
||||
builder.Entity<CartItem>().Key(c => c.CartItemId);
|
||||
builder.Entity<OrderDetail>().Key(o => o.OrderDetailId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ namespace MusicStore.Models
|
|||
[ScaffoldColumn(false)]
|
||||
public System.DateTime OrderDate { get; set; }
|
||||
|
||||
[Required]
|
||||
[ScaffoldColumn(false)]
|
||||
public string Username { get; set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -874,7 +874,7 @@ namespace MusicStore.Web.Models
|
|||
{
|
||||
genre.GenreId = genreId++;
|
||||
|
||||
// TODO [EF] Remove when null values are supported
|
||||
// TODO [EF] Remove when null values are supported by update pipeline
|
||||
genre.Description = genre.Name + " is great music (if you like it).";
|
||||
}
|
||||
|
||||
|
|
@ -918,7 +918,7 @@ CREATE TABLE [dbo].[Album](
|
|||
[ArtistId] [int] NOT NULL,
|
||||
[Title] [nvarchar](160) NOT NULL,
|
||||
[Price] [numeric](18, 2) NOT NULL,
|
||||
[AlbumArtUrl] [nvarchar](1024) NOT NULL
|
||||
[AlbumArtUrl] [nvarchar](1024) NULL
|
||||
)
|
||||
|
||||
CREATE TABLE [dbo].[Artist](
|
||||
|
|
@ -926,8 +926,8 @@ CREATE TABLE [dbo].[Artist](
|
|||
[Name] [nvarchar](max) NOT NULL
|
||||
)
|
||||
|
||||
CREATE TABLE [dbo].[Cart](
|
||||
[RecordId] [int] NOT NULL,
|
||||
CREATE TABLE [dbo].[CartItem](
|
||||
[CartItemId] [int] NOT NULL,
|
||||
[CartId] [nvarchar](max) NOT NULL,
|
||||
[AlbumId] [int] NOT NULL,
|
||||
[Count] [int] NOT NULL,
|
||||
|
|
@ -937,7 +937,7 @@ CREATE TABLE [dbo].[Cart](
|
|||
CREATE TABLE [dbo].[Genre](
|
||||
[GenreId] [int] NOT NULL,
|
||||
[Name] [nvarchar](max) NOT NULL,
|
||||
[Description] [nvarchar](max) NOT NULL
|
||||
[Description] [nvarchar](max) NULL
|
||||
)
|
||||
|
||||
CREATE TABLE [dbo].[Order](
|
||||
|
|
|
|||
|
|
@ -45,14 +45,14 @@ namespace MusicStore.Models
|
|||
if (cartItem == null)
|
||||
{
|
||||
// TODO [EF] Swap to store generated key once we support identity pattern
|
||||
var nextRecordId = _db.Carts.Any()
|
||||
? _db.Carts.Max(c => c.RecordId) + 1
|
||||
var nextCartItemId = _db.Carts.Any()
|
||||
? _db.Carts.Max(c => c.CartItemId) + 1
|
||||
: 1;
|
||||
|
||||
// Create a new cart item if no cart item exists
|
||||
cartItem = new Cart
|
||||
cartItem = new CartItem
|
||||
{
|
||||
RecordId = nextRecordId,
|
||||
CartItemId = nextCartItemId,
|
||||
AlbumId = album.AlbumId,
|
||||
CartId = ShoppingCartId,
|
||||
Count = 1,
|
||||
|
|
@ -76,7 +76,7 @@ namespace MusicStore.Models
|
|||
// Get the cart
|
||||
var cartItem = _db.Carts.Single(
|
||||
cart => cart.CartId == ShoppingCartId
|
||||
&& cart.RecordId == id);
|
||||
&& cart.CartItemId == id);
|
||||
|
||||
int itemCount = 0;
|
||||
|
||||
|
|
@ -113,7 +113,7 @@ namespace MusicStore.Models
|
|||
|
||||
}
|
||||
|
||||
public List<Cart> GetCartItems()
|
||||
public List<CartItem> GetCartItems()
|
||||
{
|
||||
return _db.Carts.Where(cart => cart.CartId == ShoppingCartId).ToList();
|
||||
}
|
||||
|
|
@ -221,7 +221,7 @@ namespace MusicStore.Models
|
|||
{
|
||||
var shoppingCart = _db.Carts.Where(c => c.CartId == ShoppingCartId);
|
||||
|
||||
foreach (Cart item in shoppingCart)
|
||||
foreach (CartItem item in shoppingCart)
|
||||
{
|
||||
item.CartId = userName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ namespace MusicStore.ViewModels
|
|||
{
|
||||
public class ShoppingCartViewModel
|
||||
{
|
||||
public List<Cart> CartItems { get; set; }
|
||||
public List<CartItem> CartItems { get; set; }
|
||||
public decimal CartTotal { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue