Entity Framework Core (डेटाबेस-पहले) के साथ MySQL तक पहुंचने की तैयारी करें

पेज निर्माण की तारीख :

ऑपरेशन पुष्टिकरण वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2022
।जाल
  • .नेट 8
एंटिटी फ्रेमवर्क कोर
  • एंटिटी फ्रेमवर्क कोर 8.0
मायएसक्यूएल
  • माईएसक्यूएल 8.4
Pomelo.EntityFrameworkCore.MySQL
  • 8.0.2

* उपरोक्त एक सत्यापन वातावरण है, लेकिन यह अन्य संस्करणों में काम कर सकता है।

पहले

एंटिटी फ्रेमवर्क कोर ओ / आर मैपर्स की एक लाइब्रेरी है जो आपको डेटाबेस तक पहुंचने पर सीधे एसक्यूएल स्टेटमेंट लिखे बिना कोड-परिभाषित मॉडल (कक्षाएं) के माध्यम से डेटाबेस रिकॉर्ड तक पहुंचने की अनुमति देती है। यह निम्नलिखित लाभ प्रदान करता है:

  • SQL स्टेटमेंट सीधे नहीं लिखता है, SQL इंजेक्शन जैसे सुरक्षा जोखिमों को कम करता है
  • चूंकि एसक्यूएल स्टेटमेंट स्ट्रिंग्स हैं, भले ही वे सिंटैक्स में गलती करते हैं, वे बिल्ड त्रुटियों की जांच के अधीन नहीं हैं, लेकिन चूंकि मॉडल एक प्रोग्राम सिंटैक्स है, इसलिए इसे बिल्ड समय पर त्रुटियों के लिए जांचा जा सकता है।

एंटिटी फ्रेमवर्क कोर स्वचालित रूप से मौजूदा डेटाबेस से इन मॉडलों और डेटाबेस से कनेक्ट करने के लिए कोड उत्पन्न करता है, इसके विपरीत, मैन्युअल रूप से कोड लिखने और फिर स्वचालित रूप से डेटाबेस उत्पन्न करने का एक तरीका है।

पूर्व को "डेटाबेस-फर्स्ट" कहा जाता है और बाद वाले को "कोड-फर्स्ट" कहा जाता है। "मॉडल-फर्स्ट" भी है जो ईआर आरेखों जैसे ब्लूप्रिंट से कोड और डेटाबेस उत्पन्न करता है, लेकिन यह एंटिटी फ्रेमवर्क कोर में व्यापक रूप से उपयोग नहीं किया जाता है।

इस बार, हम एक "डेटाबेस-फर्स्ट" पैटर्न का उपयोग करेंगे जो इस धारणा पर कोड उत्पन्न करता है कि डेटाबेस पहले से मौजूद है।

MySQL सेटअप

इस टिप में, सुनिश्चित करें कि आपने अपने MySQL डेटाबेस तक पहुंचने के लिए पहले से MySQL सेट किया है। इसे आपके विकास वातावरण में पीसी पर या नेटवर्क पर किसी अन्य पीसी पर स्थापित किया जा सकता है। यदि आप अपने विकास वातावरण से MySQL से जुड़ सकते हैं, तो आप जाने के लिए अच्छे हैं। इस टिप में, हमने MySQL को एक अलग वातावरण में स्थापित किया है।

MySQL सेटअप चरणों को छोड़ दिया जाएगा क्योंकि वे अनावश्यक होंगे। निम्न पृष्ठों सेटअप चरणों के लिए MySQL से संबंधित युक्तियाँ हैं।

तालिका बनाना

इस मामले में, हम नमूने के रूप में निम्नलिखित स्कीमा (डेटाबेस) और तालिका बनाएंगे।

  • स्कीमा नाम : test_schema
  • तालिका का नाम : उपयोगकर्ता
  • तालिका कॉलम: [आईडी], [नाम], [पासवर्ड], [आयु], [ईमेल], [जन्मदिन], [is_provisional_registration], [update_datetime]

इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे लिखते हैं, लेकिन यदि यह थकाऊ है, तो MySQL के खिलाफ निम्नलिखित SQL चलाएं और उत्पन्न करें:

स्कीमा निर्माण 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 सेटअप

मान लें कि आपने इसे पहले ही सेट कर लिया है। यदि आप सेटअप प्रक्रिया जानना चाहते हैं, तो हमने इसे अगले पृष्ठ पर संक्षेप में प्रस्तुत किया है।

एक प्रोजेक्ट बनाएं

एंटिटी फ्रेमवर्क कोर एक विशिष्ट निष्पादन वातावरण पर निर्भर नहीं करता है, इसलिए इसका उपयोग कई परियोजनाओं में किया जा सकता है। इस मामले में, हम एक साधारण कंसोल एप्लिकेशन वातावरण में एंटिटी फ्रेमवर्क कोर का उपयोग करेंगे।

नए प्रोजेक्ट में, कंसोल ऐप (जो भी .NET फ्रेमवर्क नहीं है) का चयन करें।

आपने प्रोजेक्ट बनाया है। परियोजना का नाम कुछ भी हो सकता है।

MySQL के लिए एंटिटी फ्रेमवर्क कोर पैकेज प्राप्त करें

NuGet के साथ Entity Framework Core का उपयोग करने के लिए एक पैकेज प्राप्त करें। पैकेज का उपयोग करता है: यह माइक्रोसॉफ्ट से आधिकारिक नहीं है, लेकिन इसका व्यापक रूप से उपयोग किया जाता है।

  • Pomelo.EntityFrameworkCore.MySQL

निर्भरता पर राइट-क्लिक करें और NuGet Packages प्रबंधित करें चुनें।

टैब से चयनित "ब्राउज़ करें" के साथ, खोज फ़ील्ड 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
पैरामीटर स्पष्टीकरण पैरामीटर उदाहरण
प्रदाता यदि यह MySQL है Pomelo.EntityFrameworkCore.MySql , तो निर्दिष्ट करें जैसे। Pomelo.EntityFrameworkCore.MySQL
नाता यह डेटाबेस से कनेक्ट करने के लिए कनेक्शन स्ट्रिंग है। कनेक्शन स्ट्रिंग का उपयोग अन्य ऐप्स में किया जा सकता है, इसलिए कृपया कनेक्शन स्ट्रिंग के नोटेशन के अनुसार निर्दिष्ट सामग्री लिखें। वैसे, इसका उपयोग केवल अस्थायी रूप से एक मॉडल बनाने के लिए किया जाता है, इसलिए इस कनेक्शन स्ट्रिंग के लिए ऐप प्रकाशित करने के बाद सुरक्षा के बारे में जागरूक होने की आवश्यकता नहीं है। यदि आपके पासवर्ड में कोई प्रतीक है, तो भागने के बारे में सावधान रहें। "सर्वर = टेस्टसर्वर; डेटाबेस = test_schema; उपयोगकर्ता = परीक्षण-उपयोगकर्ता; पासवर्ड = XXXXXXXX;"
स्‍त्री-विषयक यदि आपके पास पहले से कोई प्रोग्राम है तो भी अधिलेखित करें. कोई <> नहीं
आउटपुटडिर कोड को आउटपुट करने के लिए फ़ोल्डर पथ। प्रोजेक्ट फ़ोल्डर से सापेक्ष पथ मॉडल\डेटाबेस
संदर्भ निकाय फ़्रेमवर्क का उपयोग करते समय संदर्भ वर्ग नाम TestDatabaseDbContext
डेटाबेस नाम का उपयोग करें यदि निर्दिष्ट किया गया है, तो डेटाबेस में तालिका का नाम वर्ग का नाम होगा जैसा कि यह है। यदि नहीं, तो इकाई वर्ग नाम का मामला नियमों के अनुसार समायोजित किया जाता है। कोई <> नहीं
डेटाएनोटेशन यदि निर्दिष्ट किया गया है, तो स्तंभ प्रकार स्वचालित रूप से प्रत्येक गुण में DataAnnotation विशेषता जोड़ देता है. यदि आप डेटाबेस के प्रकार के अनुसार स्वचालित रूप से इनपुट जाँच करना चाहते हैं तो यह थोड़ा उपयोगी है। कोई <> नहीं
Namespace वह नामस्थान जिससे जनरेट किया गया एंटिटी वर्ग संबंधित है. यदि निर्दिष्ट नहीं है, तो नामस्थान फ़ोल्डर के अनुसार निर्धारित किया जाता है। TestNamespace
ContextNamespace वह नामस्थान जिससे जनरेट किया गया प्रसंग संबंधित है. यदि निर्दिष्ट नहीं है, तो नामस्थान फ़ोल्डर के अनुसार निर्धारित किया जाता है। TestNamespace
NoOnConfiguring अपने कोड में कच्चे कनेक्शन स्ट्रिंग एम्बेड करने से बचें। कोई <> नहीं
NoPluralize संदर्भ में प्रत्येक तालिका नाम के बहुवचन गुण नाम से बचें। कोई <> नहीं

इसे चलाने के लिए एंटर दबाएं और कोड को ऑटो-जनरेट करें: यदि यह एक त्रुटि है, तो कारण प्रदर्शित किया जाएगा, इसलिए कृपया त्रुटि की सामग्री के अनुसार प्रतिक्रिया दें।

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 उसके बाद, मैं कंसोल में जानकारी प्रदर्शित करने के लिए AND JsonSerializer.Serialize विधियों का उपयोग user करता हूं। जैसा कि user ऊपर उल्लेख किया गया है, तालिका में प्रत्येक कॉलम को एक संपत्ति के रूप में घोषित किया गया है, इसलिए व्यक्तिगत रूप से मूल्य को पुनः प्राप्त करना भी संभव है।