Day 16 建立资料库

我们现在有了基本的日志,但是每次输入完重整页面都会刷新,因为这些资料都只存在於浏览器,没有真正储存到资料库,为了保存下来,我们要跟资料库连接。
(注:Blazor WebAssembly 没有直接跟资料库沟通的能力,不过微软有提供 ASP.NET Core hosted 选项,可以在建立 Blazor WebAssembly 时一并建立 ASP.NET Core Web API 专案)

Entity Framework Core

首先在appsettings.json加入连线字串,因为测试用,所以 SqlServer 用 Windows 验证。
https://ithelp.ithome.com.tw/upload/images/20210915/20140893R18WgB5dvB.png

接着去 NuGet 套件管理员下载两个套件,分别为 Microsoft.EntityFrameworkCore.SqlServer 跟 Microsoft.EntityFrameworkCore.Tools,因为 6.0 还是预览版,所以这边用最新的稳定版 5.0.9。这两个套件是跟 SqlServer 沟通用的 ORM 套件,ORM 又是什麽呢?
https://ithelp.ithome.com.tw/upload/images/20210915/20140893139yE3t6Ha.png
https://ithelp.ithome.com.tw/upload/images/20210915/20140893jnTR39viKI.pnghttps://ithelp.ithome.com.tw/upload/images/20210915/20140893UgGjDOZWSS.png

远古时代的程序开发者想从 SqlServer 取资料回来,都必须学习 SQL 语法,後来 .NET 平台(包括 VB、C#)开发了 ADO.NET 这个取资料的好工具,将资料取回来後一一跟程序 mapping,但 ADO.NET 在资料映射上不如人意,微软便推出了 Entity Framework,这就是初始的 ORM(Object-Relational Mapper),让开发者可以把资料变成物件 (entity),不用实际去接触 SQL 语法,且有了设计工具 (Designer) 让程序开发者更好操作。

但也有些人觉得 Entity Framework 太笨重就转向另一个轻便的工具Dapper的怀抱,笔者也用过 Dapper,如果是喜欢自己组 SQL 语法的人确实会觉得方便。

而 .NET Core 这个跨平台版本的 ORM 就是用 Entity Framework Core 去做资料映射的处理。

安装完套件後,新增一个 class AppDbContext,继承DbContext,里面的建构子单纯将DbContextOptions<AppDbContext> options传给基底 class 也就是DbContext
https://ithelp.ithome.com.tw/upload/images/20210915/201408936b6Vp4ZlGk.png

接着去Startup.cs,在ConfigureServices注册使用资料库,这边用的是UseSqlServer(),当然也有UseMysql()UseOracle()可以用,只要安装相应的套件即可。
https://ithelp.ithome.com.tw/upload/images/20210915/20140893VjrjlwJ9fA.png

打开套件管理器主控台,输入指令Add-Migration Init,告诉 Entity Framework Core 要建立一个移转档案,接着就会产生转移档 Migration,这是 Entity Framework Core 的特点,在程序跟资料库之间产生中介 Migration,另外 Migration 一大好处就是在真正确定前,都可以不断修改,等确定後再更新资料库。
https://ithelp.ithome.com.tw/upload/images/20210915/20140893z6o1r7DvD1.pnghttps://ithelp.ithome.com.tw/upload/images/20210915/20140893shmauDqHtO.png
https://ithelp.ithome.com.tw/upload/images/20210915/20140893LasuFZJySd.png

Relation between Blog and Post

接下来要在 Post 里面加上 BlogId,Blog 对於 Post 而言是主表之於子表,如果新增 Migration 的时候没有加入对主表的参考(也就是主表 Foreign Key 子表),EF Core 很聪明会主动加上,但栏位名字就会是 Model+Key 的名称,变成BlogModelBlogId,我们来把名称简化。
https://ithelp.ithome.com.tw/upload/images/20210915/20140893Hj7PR9cjKt.png

先在PostModel加上两个 Property,BlogIdBlog,切记一定要这样加入,BlogId是存在资料库用的,Blog则是在串联资料的时候有个实体可以用,让我们不用自己 join 资料表,後续会再说明。
https://ithelp.ithome.com.tw/upload/images/20210915/201408939RH4G1to91.png

接着用Remove-Migration将原先的 Migration 清除,再新增一次 Migration,可以看到新的 Migration 有简化的名称BlogId了,这时候再去更新资料库。
https://ithelp.ithome.com.tw/upload/images/20210915/201408938lYJnjOsaz.png

下指令Update-Database去更新资料库,然後去服务器总管连接(找的方法跟找套件管理员一样),可以找到刚才建立的资料库Blog,资料库名字来自连线字串Database的名称,可以看到资料库已经建起来了,过程中没有用到 SQL 语法或是 SSMS 介面。
https://ithelp.ithome.com.tw/upload/images/20210915/20140893O67Dz7WPbP.pnghttps://ithelp.ithome.com.tw/upload/images/20210915/20140893tTYOv07Jgh.png

不过有一点要特别注意,中途如果换资料库的话,原先的 Migration 有很大机率产生问题,各家资料库的资料型别都有差异,所以最好一开始就规划好用哪个资料库。

除了AddDbContext<T>这种最常见的做法,还有AddDbContextFactory<T>这种在个别 Component 产生新的DbContext的方法,因为AddDbContext<T>的生命周期是scoped,对 Blazor Server 来说也就是除非关闭系统,否则DbContext都不会 dispose,有些人希望生命周期仅限於 Component 即可,就可以用AddDbContextFactory<T>

Ref: Entity Framework

Ref: Dapper

Ref: Database Providers

Ref: New DbContext instances


<<:  帐号申请

>>:  [Day1] 时间序列分析:时间序列资料属性拆解

Day22 影像辨识实作

教电脑判断是圈圈还是叉叉 我们先来看看我们的资料集(下图),看黄色的部分就好,因为像素低的关系,所以...

Day 16:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《云端情人》part 3

Samantha和Theodore在一起的时候,时常提及自己在写钢琴曲,灵感来自於和Theodore...

全端入门Day11_全端之IDE环境尾篇

昨天介绍了什麽是IDE,今天就要介绍我常用的IDE了 IDE大比较 1. Visual Studio...

Day 20 : 笔记篇 07 — 在笔记的 Metadata 使用 [[内部连结]] ,在无形之中累积对某一主题的认识

前言 在上一篇文章中,我介绍了在 Obsidian 中实作 学习笔记整理流程 的方法。我将资讯来源分...