התכוננו לגשת ל-MySQL עם Entity Framework Core (מסד נתונים תחילה)

תאריך יצירת דף :

סביבת אישור פעולה

סטודיו חזותי
  • סטודיו חזותי 2022
.רשת
  • .NET 8
ליבת מסגרת ישות
  • 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
  • שם הטבלה : משתמש
  • עמודות טבלה: [מזהה], [שם], [סיסמה], [גיל], [דואר אלקטרוני], [יום הולדת], [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. החבילה משתמשת: זה לא רשמי ממיקרוסופט, אבל הוא נמצא בשימוש נרחב.

  • 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 Package Manager ו-Package Manager Console.

תראה חלון כמו זה שלמטה, אז ודא ש"פרויקט ברירת המחדל" בפינה השמאלית העליונה הוא הפרויקט שעבורו ברצונך ליצור את המודל. (אתה צריך להיות זהיר אם יש לך מספר פרויקטים)

הזן את הטקסט הבא בשדה הקלט: הפרמטרים ישתנו בהתאם לסביבה, לכן אנא שנו אותם בזמן על סמך ההסברים הבאים.

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
חיבור זוהי מחרוזת החיבור להתחברות למסד הנתונים. ניתן להשתמש במחרוזת החיבור באפליקציות אחרות, לכן כתוב את התוכן שצוין בהתאם לסימון של מחרוזת החיבור. אגב, הוא משמש רק באופן זמני ליצירת מודל, כך שאין צורך להיות מודע לאבטחה לאחר פרסום היישום עבור מחרוזת חיבור זו. אם יש לך סמל בסיסמה שלך, היזהר מפני בריחה. "שרת = TestServer; מסד נתונים=test_schema; user=test-user; password=XXXXXXXX;"
f כפה החלפה גם אם כבר יש לך תוכנית. אין <>
פלטדיר נתיב התיקיה לפלט הקוד. נתיב יחסי מתיקיית הפרוייקט מודלים\מסד נתונים
הקשר שמות מחלקות הקשר בעת שימוש ב-Entity Framework TestDatabaseDbContext
השתמש בשמות מסד נתונים אם צוין, שם הטבלה במסד הנתונים יהיה שם המחלקה כפי שהוא. אם לא, המקרה של שם מחלקת הישות מותאם בהתאם לכללים. אין <>
ביאורי נתונים אם צוין, סוג העמודה מוסיף באופן אוטומטי את התכונה DataAnnotation לכל מאפיין. זה קצת שימושי אם אתה רוצה לבצע בדיקת קלט באופן אוטומטי בהתאם לסוג מסד הנתונים. אין <>
Namespace מרחב השמות שאליו שייכת מחלקת הישות שנוצרה. אם לא צוין, מרחב השמות נקבע בהתאם לתיקיה. מרחב שמות מבחן
מרחב שמות ההקשר מרחב השמות שאליו שייך ההקשר שנוצר. אם לא צוין, מרחב השמות נקבע בהתאם לתיקיה. מרחב שמות מבחן
NoOnConfiguring הימנע מהטמעת מחרוזות חיבור גולמיות בקוד שלך. אין <>
ללא פלורליזציה הימנע משם המאפיין ברבים של כל שם טבלה בהקשר. אין <>

הקש 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, כל עמודה בטבלה מוצהרת כמאפיין, כך שניתן גם לאחזר את הערך בנפרד.