آماده شدن برای دسترسی به MySQL با Entity Framework Core (پایگاه داده-اول)

تاریخ ایجاد صفحه :

محیط تایید عملیات

ویژوال استودیو
  • ویژوال استودیو 2022
.خالص
  • دات نت 8
هسته فریمورک Entity
  • 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 می خواهید وارد یا به روز کنید، لطفا بررسی کنید و .

راه اندازی ویژوال استودیو

با فرض اینکه قبلا آن را نیز تنظیم کرده اید. اگر می خواهید روش راه اندازی را بدانید، آن را در صفحه زیر خلاصه کرده ایم.

یک پروژه ایجاد کنید

Entity Framework Core به یک محیط اجرایی خاص بستگی ندارد، بنابراین می توان از آن در بسیاری از پروژه ها استفاده کرد. در این مورد، ما از Entity Framework Core در یک محیط اپلیکیشن کنسول ساده استفاده خواهیم کرد.

در پروژه جدید، Console App (هر کدام که .NET Framework نیست) را انتخاب کنید.

شما پروژه را ایجاد کرده اید. نام پروژه می تواند هر چیزی باشد.

دریافت پکیج Entity Framework Core برای MySQL

یک بسته برای استفاده از Entity Framework Core با NuGet دریافت کنید. این بسته از موارد زیر استفاده می کند: این رسمی از مایکروسافت نیست، اما به طور گسترده مورد استفاده قرار می گیرد.

  • Pomelo.EntityFrameworkCore.MySql

روی وابستگی کلیک راست کرده و Manage NuGet Packages را انتخاب کنید.

با انتخاب "مرور" از برگه، در قسمت Pomelo جستجو تایپ کنید. لیست بسته های مرتبط نمایش داده می شود.

بسته های زیر را از این نصب کنید:

  • Pomelo.EntityFrameworkCore.MySql

آنچه را که می خواهید نصب کنید انتخاب کنید و روی دکمه Install کلیک کنید. آخرین نسخه پایدار را برای نسخه انتخاب کنید.

دیالوگ اساسا خوب و خوب است.

من فکر می کنم بسته به شرح زیر است.

سپس در قسمت جستجو تایپ EntityFrameworkCore کرده و موارد زیر را نیز نصب کنید.

  • Microsoft.EntityFrameworkCore.Tools

برای نسخه ها، Pomelo.EntityFrameworkCore.MySql نسخه ارجاع Microsoft.EntityFrameworkCore شده توسط . این بار ما به 8.0.2 اشاره می کنیم، پس Microsoft.EntityFrameworkCore.Tools بیایید آن را 8.0.2 نیز کنیم. این بسته برای تولید کد از پایگاه داده استفاده می شود.

در پایان، باید به این شکل باشد:

ایجاد یک مدل (کد) از پیکربندی جدول پایگاه داده

برای اینکه مدل و سایر کدهای خود به طور خودکار تولید شوند، ابتدا باید پروژه خود را بسازید تا مطمئن شوید که هیچ خطایی وجود ندارد. اگر خطایی وجود داشته باشد، مدل با شکست مواجه می شود. اگر قبلا تأیید کرده اید که هیچ خطایی وجود ندارد، نیازی به ساخت ندارید.

کنسول Package Manager را از ویژوال استودیو باز کنید. در غیر این صورت، می توانید آن را از منوی Tools، 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
توضیح
پارامتر مثال پارامتر
ارائه دهنده اگر MySQL Pomelo.EntityFrameworkCore.MySql است، مانند آن را مشخص کنید. Pomelo.EntityFrameworkCore.MySql
اتصال این رشته اتصال برای اتصال به پایگاه داده است. رشته اتصال را می توان در برنامه های دیگر استفاده کرد، بنابراین لطفا محتوای مشخص شده را با توجه به علامت رشته اتصال بنویسید. به هر حال، فقط به طور موقت برای ایجاد یک مدل استفاده می شود، بنابراین پس از انتشار برنامه برای این رشته اتصال، نیازی به آگاهی از امنیت نیست. اگر نمادی در رمز عبور خود دارید، مراقب فرار باشید. "Server=TestServer; پایگاه داده=test_schema; کاربر=کاربر-آزمایشی; رمز عبور = XXXXXXXX;"
f حتی اگر قبلا برنامه ای دارید، بازنویسی اجباری کنید. بدون <>
خروجی دیر مسیر پوشه برای خروجی کد. مسیر نسبی از پوشه پروژه مدل ها\پایگاه داده
چهار چوب نام کلاس های زمینه هنگام استفاده از Entity Framework TestDatabaseDbContext
UseDatabaseNames در صورت مشخصه، نام جدول در پایگاه داده، نام کلاس همانطور که هست خواهد بود. در غیر این صورت، مورد نام کلاس موجودیت طبق قوانین تنظیم می شود. بدون <>
حاشیه نویسی های داده در صورت مشخصه، نوع ستون به طور خودکار ویژگی DataAnnotation را به هر ویژگی اضافه می کند. اگر می خواهید به طور خودکار بررسی ورودی را با توجه به نوع پایگاه داده انجام دهید، این کمی مفید است. بدون <>
Namespace فضای نامی که کلاس موجودیت تولید شده به آن تعلق دارد. اگر مشخص نشده باشد، فضای نام با توجه به پوشه تعیین می شود. فضای نام تست
فضای ContextNamespace فضای نامی که زمینه تولید شده به آن تعلق دارد. اگر مشخص نشده باشد، فضای نام با توجه به پوشه تعیین می شود. فضای نام تست
NoOnConfiguring از جاسازی رشته های اتصال خام در کد خود خودداری کنید. بدون <>
خیر جمع سازی از نام ویژگی جمع هر نام جدول در Context اجتناب کنید. بدون <>

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));
}

کلاس DbContext new تولید شده خودکار را با . به گونه ای اعلام می شود که اتصال using var پایگاه داده به طور خودکار از بین برود.

dbContext ویژگی هایی را برای دسترسی به هر مدل ایجاد کرده است، بنابراین این بار user می توانید با دسترسی به ویژگی ها، سوابق موجود در جدول User را دستکاری کنید. لازم نیست از SQL صادر شده آگاه باشید زیرا به طور خودکار در داخل تولید می شود.

ToList در اینجا ما از user یک روش پسوند برای دریافت تمام رکوردهای موجود در جدول استفاده می کنیم.

foreach پس از آن، از روش ها برای JsonSerializer.Serialize نمایش اطلاعات در کنسول استفاده user می کنم. همانطور که user در بالا ذکر شد، هر ستون در جدول به عنوان یک ویژگی اعلام می شود، بنابراین امکان بازیابی مقدار به صورت جداگانه نیز وجود دارد.