Swap database creation to use EF
Swapping database creation to use native support added to EF. Also swapping to async methods for database initialization.
This commit is contained in:
parent
0f25f9ff6b
commit
58d4b48690
|
|
@ -1,13 +1,12 @@
|
||||||
using Microsoft.Data.Entity;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Data.Entity;
|
||||||
|
using Microsoft.Data.Migrations;
|
||||||
|
using Microsoft.Data.Relational;
|
||||||
using Microsoft.Data.SqlServer;
|
using Microsoft.Data.SqlServer;
|
||||||
using MusicStore.Models;
|
using MusicStore.Models;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
#if NET45
|
|
||||||
using System.Data.Common;
|
|
||||||
using System.Data.SqlClient;
|
|
||||||
#endif
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace MusicStore.Web.Models
|
namespace MusicStore.Web.Models
|
||||||
{
|
{
|
||||||
|
|
@ -15,21 +14,41 @@ namespace MusicStore.Web.Models
|
||||||
{
|
{
|
||||||
const string imgUrl = "~/Images/placeholder.png";
|
const string imgUrl = "~/Images/placeholder.png";
|
||||||
|
|
||||||
public static void InitializeMusicStoreDatabase()
|
public static async Task InitializeMusicStoreDatabaseAsync()
|
||||||
{
|
{
|
||||||
CreateDatabaseIfNotExists();
|
using (var db = new MusicStoreContext())
|
||||||
|
{
|
||||||
|
// TODO [EF] Swap to use top level API when available
|
||||||
|
var sqlServerDataStore = db.Configuration.DataStore as SqlServerDataStore;
|
||||||
|
if (sqlServerDataStore != null)
|
||||||
|
{
|
||||||
|
var creator = new SqlServerDataStoreCreator(sqlServerDataStore, new ModelDiffer(), new SqlServerMigrationOperationSqlGenerator(), new SqlStatementExecutor());
|
||||||
|
if (!await creator.ExistsAsync())
|
||||||
|
{
|
||||||
|
await creator.CreateAsync(db.Model);
|
||||||
|
await InsertTestData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await InsertTestData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task InsertTestData()
|
||||||
|
{
|
||||||
var genres = GetGenres();
|
var genres = GetGenres();
|
||||||
var artists = GetArtists();
|
var artists = GetArtists();
|
||||||
var albums = GetAlbums(imgUrl, genres, artists);
|
var albums = GetAlbums(imgUrl, genres, artists);
|
||||||
|
|
||||||
AddOrUpdate(g => g.GenreId, genres);
|
await AddOrUpdateAsync(g => g.GenreId, genres);
|
||||||
AddOrUpdate(a => a.ArtistId, artists);
|
await AddOrUpdateAsync(a => a.ArtistId, artists);
|
||||||
AddOrUpdate(a => a.AlbumId, albums);
|
await AddOrUpdateAsync(a => a.AlbumId, albums);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO [EF] This may be replaced by a first class mechanism in EF
|
// TODO [EF] This may be replaced by a first class mechanism in EF
|
||||||
private static void AddOrUpdate<TEntity>(Func<TEntity, object> propertyToMatch, IEnumerable<TEntity> entities)
|
private static async Task AddOrUpdateAsync<TEntity>(Func<TEntity, object> propertyToMatch, IEnumerable<TEntity> entities)
|
||||||
where TEntity : class
|
where TEntity : class
|
||||||
{
|
{
|
||||||
// Query in a separate context so that we can attach existing entities as modified
|
// Query in a separate context so that we can attach existing entities as modified
|
||||||
|
|
@ -48,7 +67,7 @@ namespace MusicStore.Web.Models
|
||||||
: EntityState.Added;
|
: EntityState.Added;
|
||||||
}
|
}
|
||||||
|
|
||||||
db.SaveChanges();
|
await db.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -882,98 +901,5 @@ namespace MusicStore.Web.Models
|
||||||
|
|
||||||
return genres;
|
return genres;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO [EF] Remove when database creation is supported by EF
|
|
||||||
private static void CreateDatabaseIfNotExists()
|
|
||||||
{
|
|
||||||
// TODO [EF] Remove when SQL Client is available for K10
|
|
||||||
using (var db = new MusicStoreContext())
|
|
||||||
{
|
|
||||||
var sql = db.Configuration.DataStore as SqlServerDataStore;
|
|
||||||
if (sql != null)
|
|
||||||
{
|
|
||||||
#if NET45
|
|
||||||
var builder = new DbConnectionStringBuilder { ConnectionString = sql.ConnectionString };
|
|
||||||
var targetDatabase = builder["Database"].ToString();
|
|
||||||
|
|
||||||
// Connect to master, check if database exists, and create if not
|
|
||||||
builder.Add("Database", "master");
|
|
||||||
using (var masterConnection = new SqlConnection(builder.ConnectionString))
|
|
||||||
{
|
|
||||||
masterConnection.Open();
|
|
||||||
|
|
||||||
var masterCommand = masterConnection.CreateCommand();
|
|
||||||
masterCommand.CommandText = "SELECT COUNT(*) FROM sys.databases WHERE [name]=N'" + targetDatabase + "'";
|
|
||||||
if ((int?)masterCommand.ExecuteScalar() < 1)
|
|
||||||
{
|
|
||||||
masterCommand.CommandText = "CREATE DATABASE [" + targetDatabase + "]";
|
|
||||||
masterCommand.ExecuteNonQuery();
|
|
||||||
|
|
||||||
using (var musicStoreConnection = new SqlConnection(sql.ConnectionString))
|
|
||||||
{
|
|
||||||
musicStoreConnection.Open();
|
|
||||||
var musicStoreCommand = musicStoreConnection.CreateCommand();
|
|
||||||
musicStoreCommand.CommandText = @"
|
|
||||||
CREATE TABLE [dbo].[Album](
|
|
||||||
[AlbumId] [int] NOT NULL,
|
|
||||||
[GenreId] [int] NOT NULL,
|
|
||||||
[ArtistId] [int] NOT NULL,
|
|
||||||
[Title] [nvarchar](160) NOT NULL,
|
|
||||||
[Price] [numeric](18, 2) NOT NULL,
|
|
||||||
[AlbumArtUrl] [nvarchar](1024) NULL
|
|
||||||
)
|
|
||||||
|
|
||||||
CREATE TABLE [dbo].[Artist](
|
|
||||||
[ArtistId] [int] NOT NULL,
|
|
||||||
[Name] [nvarchar](max) NOT NULL
|
|
||||||
)
|
|
||||||
|
|
||||||
CREATE TABLE [dbo].[CartItem](
|
|
||||||
[CartItemId] [int] NOT NULL,
|
|
||||||
[CartId] [nvarchar](max) NOT NULL,
|
|
||||||
[AlbumId] [int] NOT NULL,
|
|
||||||
[Count] [int] NOT NULL,
|
|
||||||
[DateCreated] [datetime] NOT NULL
|
|
||||||
)
|
|
||||||
|
|
||||||
CREATE TABLE [dbo].[Genre](
|
|
||||||
[GenreId] [int] NOT NULL,
|
|
||||||
[Name] [nvarchar](max) NOT NULL,
|
|
||||||
[Description] [nvarchar](max) NULL
|
|
||||||
)
|
|
||||||
|
|
||||||
CREATE TABLE [dbo].[Order](
|
|
||||||
[OrderId] [int] NOT NULL,
|
|
||||||
[OrderDate] [datetime] NOT NULL,
|
|
||||||
[Username] [nvarchar](max) NOT NULL,
|
|
||||||
[FirstName] [nvarchar](160) NOT NULL,
|
|
||||||
[LastName] [nvarchar](160) NOT NULL,
|
|
||||||
[Address] [nvarchar](70) NOT NULL,
|
|
||||||
[City] [nvarchar](40) NOT NULL,
|
|
||||||
[State] [nvarchar](40) NOT NULL,
|
|
||||||
[PostalCode] [nvarchar](10) NOT NULL,
|
|
||||||
[Country] [nvarchar](40) NOT NULL,
|
|
||||||
[Phone] [nvarchar](24) NOT NULL,
|
|
||||||
[Email] [nvarchar](max) NOT NULL,
|
|
||||||
[Total] [decimal](18, 2) NOT NULL
|
|
||||||
)
|
|
||||||
|
|
||||||
CREATE TABLE [dbo].[OrderDetail](
|
|
||||||
[OrderDetailId] [int] NOT NULL,
|
|
||||||
[OrderId] [int] NOT NULL,
|
|
||||||
[AlbumId] [int] NOT NULL,
|
|
||||||
[Quantity] [int] NOT NULL,
|
|
||||||
[UnitPrice] [decimal](18, 2) NOT NULL
|
|
||||||
) ";
|
|
||||||
musicStoreCommand.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
throw new NotSupportedException("SQL Server is not yet supported when running against K10.");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -47,7 +47,7 @@ public class Startup
|
||||||
|
|
||||||
app.UseRouter(routes);
|
app.UseRouter(routes);
|
||||||
|
|
||||||
SampleData.InitializeMusicStoreDatabase();
|
SampleData.InitializeMusicStoreDatabaseAsync().Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CreateAdminUser()
|
private async void CreateAdminUser()
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
"Microsoft.Data.Relational": "0.1-alpha-*",
|
"Microsoft.Data.Relational": "0.1-alpha-*",
|
||||||
"Microsoft.Data.SqlServer": "0.1-pre-*",
|
"Microsoft.Data.SqlServer": "0.1-pre-*",
|
||||||
"Microsoft.Data.InMemory": "0.1-alpha-*",
|
"Microsoft.Data.InMemory": "0.1-alpha-*",
|
||||||
|
"Microsoft.Data.Migrations": "0.1-alpha-*",
|
||||||
"Microsoft.AspNet.Diagnostics": "0.1-alpha-*",
|
"Microsoft.AspNet.Diagnostics": "0.1-alpha-*",
|
||||||
"Microsoft.AspNet.Hosting": "0.1-alpha-*",
|
"Microsoft.AspNet.Hosting": "0.1-alpha-*",
|
||||||
"Microsoft.AspNet.Server.WebListener": "0.1-alpha-*",
|
"Microsoft.AspNet.Server.WebListener": "0.1-alpha-*",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue