連線資料庫取得模型資料來源 – Entity Framework Core

ASP.NET Core Web 應用開發–使用 MVC 框架 / PART I MVC 入門 / MVC - Model 的部份 / 連線資料庫取得模型資料來源 –Entity Framework Core

ADO.NET是傳統.NET平台存取伺服器資料庫的主要技術,其問題在於缺乏型別資訊,同時不直接支援模型的建立,對於商業應用程式的維與擴充相當不利,而因為同時必須直接針對資料庫進行實作,也降低了去耦合的設計彈性。

也因此ASP.NET Core建議採用Entity Framework Core,藉由資料模型的建立支援強型別資料的維護操作,開發人員可以專注在資料模型的操作存取,避免資料庫的維護。

相較ADO.NET以資料庫為主, Entity Framework Core的資料處理是完全不同的思維,透過連線對應與伺服器資料庫進行溝通,開發人員則是專注於資料模型的設計與互動。

資料模型由單純的類別即可定義,透過類別屬性記錄資料表欄位的資料,每一個類別實體表示一筆資料,前述的範例中定 義的KTBook類別,即是典型的資料模型。

public class KTBook
{
    [Key]
    public int BookId { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public DateTime? PublicationDate { get; set; }
    public decimal? Price { get; set; }
    public int? Pages { get; set; }
    public string ImageUrl { get; set; }
}

前述示範ADO.NETk的過程中完成資料庫的配置,現在結合KTBook,來看看初步的Entity Framework Core與資料庫存取操作。

首先從NuGet安裝Microsoft.EntityFrameworkCore.SqlServer套件,以支援Entity Framework Core對SQL Server資料庫的存取操作。

ASP.NET Core透過相依性注入機制,整合Entity Framework Core,支援資料模型的對應,而這需要預先完成一些設定。

設定模型

開啟HelloMVC專案中的appsettings.json,於其中配置需要的連線資訊。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "KTBooksConn": "Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=KTBooks;Integrated Security=True;"
  }

}

藍色標示的部份新增了表示連線字串的項目「ConnectionStrings」,後續於專案中透過此名稱來取得這裏的連線字串。

接下來,於Model資料夾中,建立新的類別檔案命名為KTBooksContext.cs,於其中配置以下的內容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; 

namespace HelloMVC.Models
{
    public class KTBooksContext:DbContext
    {
        public KTBooksContext(DbContextOptions<KTBooksContext> options)
            : base(options)
        { }
        public DbSet<KTBook> Book { get; set; }
    }
}

首先引用Microsoft.EntityFrameworkCore,接下來的KTBooksContext 繼承DbContext與基礎建構式,以支援資料連線設定所需的功能。

Book屬性則於根據指定的,負責封裝讀取的同名資料表內容回傳。

接下來設定連線資訊,開啟Startup.cs,於其中找到ConfigureServices這個函式,配置以下的內容:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDbContext<KTBooksContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("KTBooksConn") //連線字串
            )
        );

}

以藍色標示的部份完成KTBooksContext的註冊,這允許後續程式執行的過程中,自動注入需要的KTBooksContext,並以上述建立的連線項目KTBooksConn儲存的連線字串為資料庫連線資訊。

控制器與檢視

於Controllers資料夾,新增一個控制器檔案EFController.cs,於其中的配置如下的內容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using HelloMVC.Models;

namespace HelloMVC.Controllers
{
    public class EFController : Controller
    {
        private readonly KTBooksContext  _context;
        public EFController(KTBooksContext context)
        {
            _context = context;
        }
        public IActionResult Index()
        {
            var books = _context.Book; 
            return View(books);
        }
    }
}

一開始引用HelloMVC.Models,因此這裏需要稍早設定模型時建立的KTBooksContext以存取資料來源。

宣告類別層級的KTBooksContext型別變數,命名為 _context。

EFController建構定義一個KTBooksContext型別參數context,應用程式於執行的過程中,系統注入包含連線資訊的KTBooksContext物件並封裝於參數context,並且設定給_context。

動作方法Index中的_context.Book,引用KTBooksContext 的Book屬性取得對應的模型參數,當作參數傳入View(),最後於對應的檢視中呈現,這一部份與這裏請參考「MVC - Model 的部份」一節當中的實作完全相同,請自行參考。

下圖說明Entity Frameork Core,從模型建立到資料呈現的過程:

1. 控制器根據Startup.cs檔案中服務註冊的設定,注入KTBooksContext物件。

2. KTBooksContext物件根據服務註冊的設定,取得KTBooksConn所代表的連線字串資訊進行資料庫連線,而KTBooksConn是appsettings.json中的ConnectionStrings項目。

3. 動作方法中的 _context.Book於資料需要載入時,連線資料庫,取得Book資料表的的資料時,逐一建立Book物件,將欄位資料封裝於同名的屬性中回傳,完整的Book資料表資料。

沒有留言: