學習ASP.NET Core Razor 編程系列目錄
學習ASP.NET Core Razor 編程系列二——添加一個實體
學習ASP.NET Core Razor 編程系列三——創建數據表及創建項目基本頁面
學習ASP.NET Core Razor 編程系列四——Asp.Net Core Razor列表模板頁面
學習ASP.NET Core Razor 編程系列五——Asp.Net Core Razor新建模板頁面
Asp.net Core EF創建的BookContext對象,就是用於處理數據庫連接和將Book實體對象映射到數據庫表(Book)記錄的功能。數據庫上下文(BookContext)是在startup.cs文件的configureservices方法中向依賴關系注入容器注冊,代碼如下:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<BookContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("BookContext"))); services.AddMvc(); }
ASP.NET Core 配置系統會讀取數據庫連接字符串。 為了進行本地開發,它會從 appsettings.json 文件獲取數據庫連接字符串,數據庫連接配置如下:
"ConnectionStrings": { "BookContext": "Server=.\\sqlexpress;Database=CustomDB;Trusted_Connection=True;MultipleActiveResultSets=true" }
將應用程序部署到測試或生產服務器時,可以修改Appsettings.json文件中上將配置,將數據庫連接字符串設置為真正的SQL服務器。
給數據庫添加初始數據
在Visual Studio 2017的解決方案資源管理器中,使用鼠標左鍵選中Models文件,然后點擊鼠標右鍵,在彈出菜單中選擇創建一個新的類文件,命名為SeedData。用下面的代碼替換生成的代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace RazorMvcBooks.Models { public class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new BookContext( serviceProvider.GetRequiredService<DbContextOptions<BookContext>>())) { // Look for any Books. if (context.Book.Any()) { return; // DB has been seeded } context.Book.AddRange( new Book { Name = "Python編程 從入門到實踐", ReleaseDate = DateTime.Parse("2018-1-12"), Author = "埃里克·馬瑟斯", Price = 75.99M }, new Book { Name = "Java編程的邏輯", ReleaseDate = DateTime.Parse("2018-1-13"), Author = "馬俊昌", Price = 48.99M }, new Book { Name = "統計思維:大數據時代瞬間洞察因果的關鍵技能", ReleaseDate = DateTime.Parse("2017-12-23"), Author = "西內啟", Price = 39.99M }, new Book { Name = "微信營銷", ReleaseDate = DateTime.Parse("2018-01-05"), Author = "徐林海", Price = 33.99M } ); context.SaveChanges(); } } } }
以下語句的作用是 如果數據庫中有Book表,數據初始化類將返回,不添加任何數據。
// Look for any Books. if (context.Book.Any()) { return; // DB has been seeded }
添加SeedData.initializer方法
在Visual Studio 2017的解決方案資源管理器中打開Program.cs文件,然后找到Main方法,在這個方法體的最后面添加SeedData.Initialize()方法,代碼如下:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; using RazorMvcBooks.Models; namespace RazorMvcBooks { public class Program { public static void Main(string[] args) { // BuildWebHost(args).Run(); var host = BuildWebHost(args); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService<BookContext>(); // requires using Microsoft.EntityFrameworkCore; context.Database.Migrate(); // Requires using RazorPagesMovie.Models; SeedData.Initialize(services); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "數據庫數據初始化錯誤."); } } host.Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); } }
測試應用程序
第一步,刪除數據庫中的所有記錄。 可以在瀏覽器的書籍列表頁面中使用刪除鏈接,或可以在數據庫的SQL Server Management Studio中使用刪除指令刪除。在瀏覽器我們進行瀏覽,刪除之前與之后的界面如下圖。
第二步,強制應用程序初始化(調用 Startup 類中的方法),這樣SeedData方法能夠正常運行。如果要強制初始化,必須先停止IIS,然后再重新啟動。您可以使用以下方法:
1. 在通知區域中右鍵單擊IIS Express系統托盤圖標,在彈出菜單中使用鼠標左鍵點擊“退出”或“停止站點。如下圖。
2. 如果是在非調試模式下運行 Visual Studio 2017 ,請按 F5 以在調試模式下運行。
3. 如果是在調試模式下運行 Visual Studio 2017 ,請先停止調試程序,並再按 F5。
第三步,在瀏覽器中瀏覽我們添加到數據庫的初始化數據,如下圖。下圖1處,是原來的數據,圖2是我們應用程序初始化添加進行的數據。仔細觀察一下ReleaseDate與Price,可以發現有區別。