學習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 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,可以發現有區別。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM