เตรียมเข้าถึง MySQL ด้วย Entity Framework Core (ฐานข้อมูลก่อน)
สภาพแวดล้อมการยืนยันการทํางาน
- วิชวลสตูดิโอ
-
- วิชวลสตูดิโอ 2022
- ตาข่าย
-
- .NET 8
- แกน Entity Framework
-
- Entity Framework Core 8.0
- MySQL
-
- MySQL 8.4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
*ข้างต้นเป็นสภาพแวดล้อมการตรวจสอบ แต่อาจใช้งานได้ในเวอร์ชันอื่น
ทีแรก
Entity Framework Core เป็นไลบรารีของตัวแมป O/R ที่อนุญาตให้คุณเข้าถึงระเบียนฐานข้อมูลผ่านแบบจําลองที่กําหนดรหัส(คลาส) โดยไม่ต้องเขียนคําสั่ง SQL โดยตรงเมื่อเข้าถึงฐานข้อมูล สิ่งนี้ให้ประโยชน์ดังต่อไปนี้:
- ไม่เขียนคําสั่ง SQL โดยตรง ช่วยลดความเสี่ยงด้านความปลอดภัย เช่น การแทรก SQL
- เนื่องจากคําสั่ง SQL เป็นสตริงแม้ว่าจะทําผิดพลาดในไวยากรณ์ก็ไม่อยู่ภายใต้การตรวจสอบข้อผิดพลาดในการสร้าง แต่เนื่องจากโมเดลเป็นไวยากรณ์ของโปรแกรมจึงสามารถตรวจสอบข้อผิดพลาดได้ในเวลาที่สร้าง
Entity Framework Core สร้างโค้ดโดยอัตโนมัติเพื่อเชื่อมต่อกับโมเดลและฐานข้อมูลเหล่านี้จากฐานข้อมูลที่มีอยู่ ในทางกลับกัน มีวิธีเขียนโค้ดด้วยตนเองแล้วสร้างฐานข้อมูลโดยอัตโนมัติ
อดีตเรียกว่า "ฐานข้อมูลก่อน" และหลังเรียกว่า "โค้ดก่อน" นอกจากนี้ยังมี "โมเดลแรก" ที่สร้างโค้ดและฐานข้อมูลจากพิมพ์เขียว เช่น ไดอะแกรม ER แต่ไม่ได้ใช้กันอย่างแพร่หลายใน Entity Framework Core
คราวนี้เราจะใช้รูปแบบ "ฐานข้อมูลเป็นอันดับแรก" ที่สร้างโค้ดบนสมมติฐานที่ว่ามีฐานข้อมูลอยู่แล้ว
การตั้งค่า MySQL
ในเคล็ดลับนี้ ตรวจสอบให้แน่ใจว่าคุณตั้งค่า MySQL ไว้ล่วงหน้าเพื่อเข้าถึงฐานข้อมูล MySQL ของคุณ สามารถตั้งค่าบนพีซีในสภาพแวดล้อมการพัฒนาของคุณหรือบนพีซีเครื่องอื่นผ่านเครือข่าย หากคุณสามารถเชื่อมต่อกับ MySQL จากสภาพแวดล้อมการพัฒนาของคุณคุณก็พร้อมที่จะไป ในเคล็ดลับนี้เราได้ติดตั้ง MySQL ในสภาพแวดล้อมที่แตกต่างกัน
ขั้นตอนการตั้งค่า MySQL จะถูกละเว้นเนื่องจากจะซ้ําซ้อน หน้าต่อไปนี้มีเคล็ดลับที่เกี่ยวข้องกับ MySQL สําหรับขั้นตอนการตั้งค่า
การสร้างตาราง
ในกรณีนี้เราจะสร้างสคีมา (ฐานข้อมูล) และตารางต่อไปนี้เป็นตัวอย่าง
- ชื่อสคีมา : test_schema
- ชื่อตาราง : user
- คอลัมน์ตาราง : [id], [name], [password], [age], [email], [birthday], [is_provisional_registration], [update_datetime]
ไม่สําคัญว่าคุณจะเขียนอย่างไร แต่ถ้ามันน่าเบื่อให้เรียกใช้และสร้าง SQL ต่อไปนี้กับ MySQL:
ต่อไปนี้เป็น SQL การสร้างสคีมา:
CREATE DATABASE `test_schema`;
การสร้างตารางเป็น SQL
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(20) NOT NULL,
`password` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(200) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`is_provisional_registration` tinyint(1) NOT NULL,
`update_datetime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';
เพิ่มระเบียนลงใน SQL
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');
ตั้งค่าสิทธิ์สําหรับบัญชีของคุณ
ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าชื่อโฮสต์เพื่อให้บัญชีที่คุณโปรแกรมสามารถเข้าถึงสคีมา MySQL ได้
คุณต้องตั้งค่าสิทธิ์ในการเข้าถึง test_schema
บัญชีที่คุณต้องการเชื่อมต่อด้วย
คราวนี้เราจะดําเนินการตามSELECT
ขั้นตอนการดึงบันทึก
ฉันจะไม่ทําในครั้งนี้ แต่ถ้าคุณINSERT
UPDATE
ต้องการแทรกหรืออัปเดตโปรดตรวจสอบและ
การตั้งค่า Visual Studio
สมมติว่าคุณได้ตั้งค่าไว้แล้วเช่นกัน หากคุณต้องการทราบขั้นตอนการตั้งค่า เราได้สรุปไว้ในหน้าต่อไปนี้
สร้างโครงการ
Entity Framework Core ไม่ได้ขึ้นอยู่กับสภาพแวดล้อมการดําเนินการเฉพาะ ดังนั้นจึงสามารถใช้ในหลายโครงการได้ ในกรณีนี้ เราจะใช้ Entity Framework Core ในสภาพแวดล้อมแอปพลิเคชันคอนโซลอย่างง่าย
ในโครงการใหม่ ให้เลือก แอปคอนโซล (แล้วแต่ว่าอย่างใดไม่ใช่ .NET Framework)
คุณได้สร้างโครงการแล้ว ชื่อโครงการสามารถเป็นอะไรก็ได้
รับแพ็คเกจ Entity Framework Core สําหรับ MySQL
รับแพคเกจเพื่อใช้ Entity Framework Core กับ NuGet แพคเกจใช้: นี่ไม่ใช่ทางการจาก Microsoft แต่มีการใช้กันอย่างแพร่หลาย
- Pomelo.EntityFrameworkCore.MySql
คลิกขวาที่การขึ้นต่อกัน แล้วเลือก จัดการแพ็คเกจ NuGet
เมื่อเลือก "เรียกดู" จากแท็บ ให้พิมพ์ในช่องค้นหา Pomelo
รายการแพ็คเกจที่เกี่ยวข้องจะปรากฏขึ้น
ติดตั้งแพ็คเกจต่อไปนี้จากสิ่งนี้:
- Pomelo.EntityFrameworkCore.MySql
เลือกสิ่งที่คุณต้องการติดตั้งและคลิกปุ่มติดตั้ง เลือกเวอร์ชันเสถียรล่าสุดสําหรับเวอร์ชัน
บทสนทนานั้นโอเคและดี
ฉันคิดว่าแพ็คเกจมีดังนี้
จากนั้นพิมพ์ในช่อง EntityFrameworkCore
ค้นหาและติดตั้งต่อไปนี้ด้วย
- Microsoft.EntityFrameworkCore.Tools
สําหรับรุ่น ให้ Pomelo.EntityFrameworkCore.MySql
ตรงกับรุ่นที่อ้างอิง Microsoft.EntityFrameworkCore
โดย
คราวนี้เรากําลังอ้างถึง 8.0.2 ดังนั้น Microsoft.EntityFrameworkCore.Tools
เรามาทําให้เป็น 8.0.2 กันเถอะ
แพคเกจนี้ใช้เพื่อสร้างรหัสจากฐานข้อมูล
ในท้ายที่สุดมันควรมีลักษณะดังนี้:
สร้างแบบจําลอง (รหัส) จากการตั้งค่าคอนฟิกตารางฐานข้อมูล
ในการสร้างโมเดลและโค้ดอื่นๆ โดยอัตโนมัติ ก่อนอื่นคุณต้องสร้างโปรเจ็กต์เพื่อให้แน่ใจว่าไม่มีข้อผิดพลาด หากมีข้อผิดพลาดโมเดลจะล้มเหลว หากคุณตรวจสอบแล้วว่าไม่มีข้อผิดพลาด คุณไม่จําเป็นต้องสร้าง
เปิดคอนโซลตัวจัดการแพคเกจจาก Visual Studio หากไม่เป็นเช่นนั้น คุณสามารถเปิดได้จากเมนู เครื่องมือ ตัวจัดการแพ็คเกจ NuGet และคอนโซลตัวจัดการแพ็คเกจ
คุณจะเห็นหน้าต่างดังด้านล่าง ดังนั้นตรวจสอบให้แน่ใจว่า "โครงการเริ่มต้น" ที่มุมขวาบนเป็นโครงการที่คุณต้องการสร้างโมเดล (คุณต้องระมัดระวังหากคุณมีหลายโครงการ)
ป้อนข้อความต่อไปนี้ในช่องป้อนข้อมูล: พารามิเตอร์จะเปลี่ยนไปตามสภาพแวดล้อม ดังนั้นโปรดเปลี่ยนพารามิเตอร์ในเวลาที่เหมาะสมตามคําอธิบายต่อไปนี้
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
ตัวอย่างอินพุต
Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
คําอธิบายพารามิเตอร์ | ตัวอย่าง | พารามิเตอร์ |
---|---|---|
ผู้จัดหา | ถ้าเป็น Pomelo.EntityFrameworkCore.MySql MySQL ให้ระบุเช่น. |
Pomelo.EntityFrameworkCore.MySql |
การเชื่อมต่อ | นี่คือสตริงการเชื่อมต่อเพื่อเชื่อมต่อกับฐานข้อมูล สตริงการเชื่อมต่อสามารถใช้ในแอปอื่นได้ ดังนั้นโปรดเขียนเนื้อหาที่ระบุตามสัญกรณ์ของสตริงการเชื่อมต่อ อย่างไรก็ตาม จะใช้ชั่วคราวเพื่อสร้างโมเดลเท่านั้น ดังนั้นจึงไม่จําเป็นต้องตระหนักถึงความปลอดภัยหลังจากเผยแพร่แอปสําหรับสตริงการเชื่อมต่อนี้ หากคุณมีสัญลักษณ์ในรหัสผ่าน โปรดระวังการหลบหนี | "เซิร์ฟเวอร์=เซิร์ฟเวอร์ทดสอบ; ฐานข้อมูล=test_schema; ผู้ใช้=ทดสอบผู้ใช้; รหัสผ่าน=XXXXXXXX;" |
f | บังคับเขียนทับแม้ว่าคุณจะมีโปรแกรมอยู่แล้วก็ตาม | ไม่มี<> |
เอาต์พุต | เส้นทางโฟลเดอร์เพื่อส่งออกโค้ด เส้นทางสัมพัทธ์จากโฟลเดอร์โครงการ | โมเดล\ฐานข้อมูล |
บริบท | ชื่อคลาสบริบทเมื่อใช้ Entity Framework | TestDatabaseDbContext |
UseDatabaseNames | หากระบุชื่อตารางในฐานข้อมูลจะเป็นชื่อคลาสตามที่เป็นอยู่ ถ้าไม่เป็นเช่นนั้น กรณีของชื่อคลาสเอนทิตีจะถูกปรับตามกฎ | ไม่มี<> |
คําอธิบายประกอบข้อมูล | ถ้าระบุ ชนิดคอลัมน์จะผนวกแอตทริบิวต์ DataAnnotation ให้กับแต่ละคุณสมบัติโดยอัตโนมัติ สิ่งนี้มีประโยชน์เล็กน้อยหากคุณต้องการทําการตรวจสอบอินพุตโดยอัตโนมัติตามประเภทของฐานข้อมูล | ไม่มี<> |
Namespace | เนมสเปซที่คลาสเอนทิตีที่สร้างขึ้นเป็นอยู่ หากไม่ได้ระบุ namespace จะถูกกําหนดตามโฟลเดอร์ | TestNamespace |
ContextNamespace | เนมสเปซที่บริบทที่สร้างขึ้นเป็นอยู่ หากไม่ได้ระบุ namespace จะถูกกําหนดตามโฟลเดอร์ | TestNamespace |
NoOn การกําหนดค่า | หลีกเลี่ยงการฝังสตริงการเชื่อมต่อดิบในโค้ดของคุณ | ไม่มี<> |
ไม่พหูพจน์ | หลีกเลี่ยงชื่อคุณสมบัติพหูพจน์ของแต่ละชื่อตารางในบริบท | ไม่มี<> |
กด Enter เพื่อเรียกใช้และสร้างรหัสอัตโนมัติ: หากเป็นข้อผิดพลาด เหตุผลจะปรากฏขึ้น ดังนั้นโปรดตอบกลับตามเนื้อหาของข้อผิดพลาด
user
รหัสแบบจําลองสําหรับตารางมีลักษณะดังนี้:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SetupMysqlDatabaseFirst.Models.Database;
<summary>
テストコメント
</summary>
public partial class user
{
[Key]
public int id { get; set; }
[StringLength(20)]
public string name { get; set; } = null!;
[StringLength(20)]
public string? password { get; set; }
public int? age { get; set; }
[StringLength(200)]
public string? email { get; set; }
public DateOnly? birthday { get; set; }
public bool is_provisional_registration { get; set; }
[Column(TypeName = "datetime")]
public DateTime? update_datetime { get; set; }
}
อย่างไรก็ตามคําเตือนจะปรากฏขึ้นเนื่องจากสตริงการเชื่อมต่อถูกเขียนตามที่เป็นอยู่ในรหัสของคลาสบริบทที่สร้างขึ้น ถ้าเป็นไปได้ควรเก็บสตริงการเชื่อมต่อไว้ในที่แยกต่างหากและตั้งค่าเมื่อรันไทม์ แต่คราวนี้มีวัตถุประสงค์เพื่อตรวจสอบการทํางานดังนั้นฉันจะปล่อยไว้เหมือนเดิม
รับบันทึกและดู
เมื่อคุณมีรหัสสําหรับเข้าถึงระเบียนในฐานข้อมูลแล้ว ลองรับระเบียนและแสดงในคอนโซล
Program.cs
และแก้ไขดังนี้
using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;
Console.WriteLine("Hello, World!");
// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();
// データベースから User 一覧を取得する
var users = dbContext.user.ToList();
// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
Console.WriteLine(JsonSerializer.Serialize(user));
}
สร้างคลาสnew
ที่สร้างขึ้นDbContext
โดยอัตโนมัติด้วย มีการประกาศเพื่ออนุญาตให้using var
การเชื่อมต่อฐานข้อมูลถูกทําลายโดยอัตโนมัติ
dbContext
ได้สร้างคุณสมบัติเพื่อเข้าถึงแต่ละโมเดล ดังนั้นคราว user
นี้คุณสามารถจัดการเรกคอร์ดในตารางได้โดยการเข้าถึง User
คุณสมบัติ
คุณไม่จําเป็นต้องทราบ SQL ที่ออก เนื่องจากจะถูกสร้างขึ้นโดยอัตโนมัติภายใน
ToList
ที่นี่เราใช้user
วิธีการขยายเพื่อรับระเบียนทั้งหมดในตาราง
foreach
หลังจากนั้นฉันใช้user
วิธีการและJsonSerializer.Serialize
เพื่อแสดงข้อมูลในคอนโซล
ดังที่ได้user
กล่าวไว้ข้างต้นแต่ละคอลัมน์ในตารางจะถูกประกาศเป็นคุณสมบัติดังนั้นจึงสามารถดึงค่าทีละรายการได้