環境與版本

作業系統:Window10 64x 版本:2004

開發軟件(IDE):Visual Studio 2019 Community

.NET版本:ASP.NET Core 3.1

專案架構:MVC

資料庫產品版本:SQL Server 2014 Express Edition (64-bit)

資料庫版本編號:12.0.2000.8

繼上篇[C#學習]ASP.NET CORE MVC 檢視(VIEW) 使用與範本 進行延續學習使用範本

新增資料模型類別

在創建Models資料夾下創建Movie.cs

使用下列程式碼更新 Movie.cs 檔案:

using System;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

第9行 Id 欄位是資料庫的必要欄位,將作為主索引鍵。

第11行 DataType上的屬性 ReleaseDate 指定資料 (Date的類型 ) 。 使用此屬性:

  • 使用者不需要在日期欄位中輸入時間資訊。
  • 只會顯示日期,不會顯示時間資訊。

新增 NuGet 套件

NuGet是一個自由開源軟體包管理系統。用於Microsoft開發平台。以前稱NuPack。針對. NET (包括. NET Core),Microsoft 支援的共用程式碼機制

在工具->NuGet套件管理員->PMC(Package Magament Console 套件管理器主控台)

輸入以下 安裝程式碼

Install-Package Microsoft.EntityFrameworkCore.SqlServer

命令會新增 EF Core SQL Server 提供者。 提供者套件會將 EF Core 套件作為相依性安裝。 

建立資料庫內容類別

資料庫內容類別是使用MvcMovie/Models/Movie.cs 的模型(必要) ,使用EF Core 產生功能 (建立C、讀取R、更新U、刪除D) 。

建立Model/Data/MvcMovieContext.cs,並新增以下內容:

using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<Movie> Movie { get; set; }
    }
}

第13行 程式碼內DbSet <Movie> 會建立實體集。 在 Entity Framework 詞彙中,實體集通常會對應至資料庫資料表。 實體會對應至資料表中的資料列。

登錄資料庫內容

ASP.NET Core 內建相依性插入 (DI)。 服務 (例如 EF Core 資料庫內容) 必須在應用程式啟動期間向 DI 進行註冊。 需要這些服務的元件 (例如 Razor 頁面) 是透過函式參數提供這些服務。 取得資料庫內容執行個體的建構函式程式碼。

在 Startup.cs 最上方新增下列 using 陳述式:

using MvcMovie.Data;
using Microsoft.EntityFrameworkCore;

在 Startup.ConfigureServices 中新增下列第5~6行的程式碼:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

連接字串的名稱,會透過對 DbContextOptions 物件呼叫方法來傳遞至內容。 作為本機開發之用,ASP.NET Core configuration system 會從 appsettings.json 檔案讀取連接字串。

新增資料庫連線字串

將13~14行連接字串新增至檔案 * 上的appsettings.js* :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  //"ConnectionStrings": {
  //  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  //},
  "ConnectionStrings": {
    "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

使用 scaffolding 程式碼產生器

使用 scaffolding 工具來為影片模型產生建立、讀取、更新和刪除 (CRUD) 頁面。

模型類別: Movie (MvcMovie.Models)
資料內容類別: MvcMovie.Data.MvcMovieContext.cs (MvcMovie 的資料)
檢視: 保持核取預設的每一個選項
控制器名稱: 保留預設值 MoviesController
選取 [新增]

接下來Visual Studio就會自動會建立:

  • Controllers/MoviesController.cs
  • Razor 查看建立、刪除、詳細資料、編輯和索引頁面的檔案 (Views/Movies/ * cshtml)

自動建立這些檔案的流程稱為 scaffolding

初始移轉

使用 EF Core 的 移轉 功能來建立資料庫。 移轉是一組工具,可讓您建立和更新資料庫,使其與您的資料模型相符。

從 [工具]功能表中,選取 [NuGet 套件管理員] >[套件管理器主控台Package Manager Console](PMC)。

輸入下列命令:

Add-Migration InitialCreate
Update-Database
  • Add-Migration InitialCreate:產生 migrations/{timestamp} _InitialCreate .cs 遷移用的檔案。 InitialCreate 引數是移轉名稱。 您可以使用任何名稱,但依照慣例,會選取描述移轉的名稱。 因為這是第一次移轉,所產生類別會包含建立資料庫結構描述的程式碼。 資料庫結構描述是以 MvcMovieContext 類別為基礎。
  • Update-Database:將資料庫更新為先前命令所建立的最新遷移。 此命令會執行 Migrations/{time-stamp}_InitialCreate.cs 檔案中的 Up  function,其會建立資料庫。

檢查 Migrations/{timestamp}_InitialCreate.cs 移轉檔案:

public partial class Initial : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Movie",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", 
                                 SqlServerValueGenerationStrategy.IdentityColumn),
                Title = table.Column<string>(nullable: true),
                ReleaseDate = table.Column<DateTime>(nullable: false),
                Genre = table.Column<string>(nullable: true),
                Price = table.Column<decimal>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Movie", x => x.Id);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Movie");
    }
}

Up 方法會建立 Movie 資料表,並將 Id 設為主索引鍵。 Down 方法會還原 Up 移轉所做的結構描述變更。

測試應用程式

開啟應用程式,然後按一下 [Movie App]**** 連結。

以上為測試Create、Edit、Details 和 Delete 頁面。

控制器中的相依性插入(Dependency Injection,DI)

 Controllers/MoviesController.cs 檔案,並檢查建構函式:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

建構函式會使用相依性插入將資料庫內容 (MvcMovieContext) 插入到控制器中。 控制器中的每一個 CRUD 方法都會使用資料庫內容。

參考資料:

第4部分:將模型新增至 ASP.NET Core MVC 應用程式https://docs.microsoft.com/zh-tw/aspnet/core/tutorials/first-mvc-app/adding-view?view=aspnetcore-3.1&tabs=visual-studio

如需 EF Core PMC 工具的詳細資訊,請參閱 EF Core 工具參考 – Visual Studio 中的 PMC

This Post Has One Comment

發佈留言