कोर में एंटिटी फ्रेमवर्क कोर का उपयोग करके डेटाबेस ASP.NET

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

पर्यावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2019
ASP.NET कोर
  • 3.1 (एमवीसी, रेजर पेज)
एसक्यूएल सर्वर
  • 2019 एक्सप्रेस

पहले

यह सुझाव निम्नलिखित कोर दृष्टिकोण का उपयोग करके एंटिटी फ्रेमवर्क कोर का उपयोग करने के लिए चरणों ASP.NET हैं।

एक डेटाबेस बनाना, एंटिटी फ्रेमवर्क कोर का उपयोग करके, और इसी तरह इस सुझावों का मुख्य ध्यान नहीं है, इसलिए हम विस्तार में नहीं जाएंगे। वे कोर के बाहर उसी तरह से इस्तेमाल किया ASP.NET ।

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

एक डेटाबेस टेबल बनाएं

यह टिप्स एसक्यूएल सर्वर का उपयोग करता है। अपने स्थानीय वातावरण में या किसी भी सर्वर पर एसक्यूएल सर्वर स्थापित करें।

यदि आपके पास परीक्षण के लिए डेटाबेस नहीं है, तो एक डेटाबेस बनाएं।

यदि आप एसक्यूएल में बना रहे हैं, जैसे कि निम्नलिखित, अपने पर्यावरण के अनुरूप एसक्यूएल सर्वर संस्करण पथ और डेटाबेस नाम बदलें।

USE [master]
GO

CREATE DATABASE [TestDatabase]
  CONTAINMENT = NONE
  ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
  LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
  WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO

परीक्षण के लिए एक टेबल बनाएं। अपडेट और विलोपन के लिए प्राथमिक कुंजी सेट करें।

यदि आप इसे एसक्यूएल में बनाना चाहते हैं:

USE [TestDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User](
  [ID] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL,
  [Password] [nvarchar](20) NOT NULL,
  [Age] [int] NULL,
  [Email] [nvarchar](200) NULL,
  [Birthday] [date] NULL,
  [UpdateDateTime] [datetime2](7) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

प्रदर्शन के लिए एक रिकॉर्ड जोड़ें।

यदि आप इसे एसक्यूएल में जोड़ना चाहते हैं:

USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO

कोर में उपलब्ध ASP.NET इकाई ढांचा

यह आइटम एमवीसी और रेजर दोनों पृष्ठों के लिए आम है।

एंटिटी फ्रेमवर्क कोर का पैकेज इंस्टॉलेशन

एक बार जब आप अपना प्रोजेक्ट बना लेते हैं, तो NuGet से पैकेज प्राप्त करें ताकि आप पहले एंटिटी फ्रेमवर्क कोर का उपयोग कर सकें। एमवीसी एक उदाहरण है, लेकिन ऑपरेशन रेजर पृष्ठों पर एक ही है।

परियोजना से सही क्लिक निर्भरता और प्रबंधित NuGet संकुल का चयन करें।

टैब से चुने गए ब्राउज़ के साथ, खोज क्षेत्र में एंटिटीफ्रेमवर्ककोर टाइप करें। एंटिटी फ्रेमवर्क कोर से संबंधित पैकेज सूची में दिखाई देते हैं।

इस समय से, मैं एसक्यूएल सर्वर का उपयोग करूंगा, इसलिए मैं निम्नलिखित पैकेज स्थापित करूंगा।

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

आइए एक उदाहरण के रूप में Microsoft.EntityFrameworkCore स्थापित करें, इसलिए अन्य दो को भी स्थापित करें।

आप क्या इंस्टॉल करना चाहते हैं, उसे चुनें और फिर इंस्टॉल बटन पर क्लिक करें। संस्करण नवीनतम स्टेबलाइजर का चयन करता है।

संवाद मूल रूप से ठीक क्लिक करने के लिए ठीक है।

अन्य दो के रूप में अच्छी तरह से स्थापित करें।

मुझे लगता है कि पैकेज इस प्रकार है ।

डेटाबेस टेबल कॉन्फ़िगरेशन से एक मॉडल (प्रोग्राम) बनाएं

यदि आप एंटिटी फ्रेमवर्क कोर में डेटा डेटा को डेटा से पुनः प्राप्त करना या अपडेट करना चाहते हैं, आपको आमतौर पर एक प्रोग्राम बनाने की आवश्यकता होती है जो टेबल कॉन्फ़िगरेशन के आधार पर एक मॉडल है। इस मॉडल को एक उपनाम इकाई भी कहा जाता है।

जब आप एक मॉडल बनाते हैं, तो पहले कोड, मॉडल (प्रोग्राम) या पहले डेटाबेस है, जो टेबल से मॉडल (प्रोग्राम) बनाने की एक तकनीक है। यहां एक टेबल से स्वचालित रूप से प्रोग्राम करने का एक सरल डेटाबेस-पहला तरीका है।

वैसे, ये स्टेप्स कोर में ASP.NET हैं, इसलिए आप इन्हें कंसोल या डेस्कटॉप ऐप में उसी तरह बना सकते हैं।

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

विजुअल स्टूडियो से, पैकेज मैनेजर कंसोल खोलें। अन्यथा, आप इसे मेनू में टूल, नुगेट पैकेज मैनेजर और पैकेज मैनेजर कंसोल से खोल सकते हैं।

आपको नीचे दिए गए एक विंडो के समान विंडो दिखाई देगा, इसलिए सुनिश्चित करें कि शीर्ष दाईं ओर डिफ़ॉल्ट प्रोजेक्ट वह परियोजना है जिसे आप मॉडल करना चाहते हैं। (यदि आपके पास कई परियोजनाएं हैं तो आपको सावधान रहने की आवश्यकता है)

इनपुट फ़ील्ड में, निम्नलिखित पाठ टाइप करें: मापदंडों पर्यावरण के आधार पर बदलती हैं, तो कृपया उन्हें निम्नलिखित विवरण के लिए एक समय पर तरीके से बदल जाते हैं। (विशेष रूप से जहां यह विशेष रूप से * है)

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=********\SQLEXPRESS;Database=TestDatabase;user id=********;password=**********" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations

एक हाइफेनेटेड -Provider एक, जैसे कि प्रत्येक नाम के सिर पर, पैरामीटर नाम है, जिसके बाद उस पैरामीटर का मूल्य होता है।

पैरामीटर विवरण पैरामीटर उदाहरण
प्रदाता Microsoft.EntityFrameworkCore.SqlServerएसक्यूएल सर्वर में फिक्स्ड। Microsoft.EntityFrameworkCore.SqlServer
कनेक्शन डेटाबेस से कनेक्ट करने के लिए कनेक्शन स्ट्रिंग। कनेक्शन तार आम में अन्य क्षुधा में इस्तेमाल किया जा सकता है, तो कृपया लिखें कि आप क्या कनेक्शन स्ट्रिंग kineki के अनुसार निर्दिष्ट करते हैं। विंडोज ऑथेंटिकेशन और एसक्यूएल सर्वर प्रमाणीकरण दोनों उपलब्ध हैं। वैसे, इसका उपयोग केवल अस्थायी रूप से एक मॉडल बनाने के लिए किया जाता है, इसलिए इस कनेक्शन स्ट्रिंग के लिए ऐप प्रकाशित होने के बाद आपको सुरक्षा के बारे में जागरूक होने की आवश्यकता नहीं है। यदि आपके पासवर्ड में एक प्रतीक है तो बचने से सावधान रहें। "डेटा स्रोत= ServerName\SQLEXPRESS;Data=TestDatabase;user id=UserName;password=***"
स्‍त्री-विषयक बल ओवरराइटिंग भले ही वहां पहले से ही एक कार्यक्रम है । <नहीं,>
आउटपुटडिर फ़ोल्डर पथ जिसमें कोड आउटपुट है। परियोजना फ़ोल्डर से रिश्तेदार पथ मॉडल \ डाटाबेस
संदर्भ एंटिटी फ्रेमवर्क का उपयोग करते समय संदर्भ वर्ग का नाम टेस्टडेटाबेसडीबीकोंटेक्स्ट
UseDatabaseNames यदि निर्दिष्ट किया जाता है, तो डेटाबेस का तालिका नाम कक्षा का नाम बन जाता है। अन्यथा, केस और एंटिटी क्लास नाम के मल्टीपल फॉर्म को नियमों के मुताबिक एडजस्ट किया जाता है। <नहीं,>
डेटाननोटेशन यदि निर्दिष्ट किया जाता है, तो कॉलम प्रकार स्वचालित रूप से प्रत्येक संपत्ति के लिए डेटानॉटेशन विशेषता को संलग्न करता है। यदि आप डेटाबेस के प्रकार के अनुसार इनपुट को स्वचालित रूप से जांचना चाहते हैं तो यह थोड़ा उपयोगी है। <नहीं,>

इसे चलाने के लिए एंटर दबाना स्वचालित रूप से कोड उत्पन्न करेगा:

उपयोगकर्ता तालिका के लिए मॉडल कोड इस प्रकार है:

[Table("User")]
public partial class User
{
  [Key]
  public int ID { get; set; }
  [Required]
  [StringLength(20)]
  public string Name { get; set; }
  [Required]
  [StringLength(20)]
  public string Password { get; set; }
  public int? Age { get; set; }
  [StringLength(200)]
  public string Email { get; set; }
  [Column(TypeName = "date")]
  public DateTime? Birthday { get; set; }
  public DateTime? UpdateDateTime { get; set; }
}

वैसे, चेतावनी प्रदर्शित की जाती है क्योंकि कनेक्शन स्ट्रिंग सूचीबद्ध है क्योंकि यह उत्पन्न संदर्भ वर्ग के कोड में है। कोड उत्पन्न होने के बाद इस संदर्भ वर्ग में विधियों को हटाना सुनिश्चित OnConfiguring करें।

कनेक्शन के तार पंजीकृत करें

यह कोर-विशिष्ट प्रसंस्करण ASP.NET। (यदि आप इसे अनुकूलित करते हैं, तो आप इसे अन्य .NET कोर ऐप्स में उपयोग कर सकते हैं, लेकिन ASP.NET आप इसे कोर के लिए डिफ़ॉल्ट रूप से संभाल सकते हैं।

पैकेज मैनेजर कंसोल में निर्दिष्ट कनेक्शन स्ट्रिंग का उपयोग केवल मॉडल उत्पन्न करने के लिए किया गया था।

वेब ऐप के रूप में डेटाबेस से कनेक्ट करने के लिए कनेक्शन स्ट्रिंग appsettings.json में सूचीबद्ध है। यदि आप प्रत्येक बिल्ड या प्रकाशन के लिए कनेक्ट करने के लिए डेटाबेस गंतव्य को बदलना चाहते हैं, तो आप ऐपेटिंग का उपयोग कर सकते हैं। इसे विकास-जैसन आदि द्वारा भी शाखा किया जा सकता है।

इसके अलावा, चूंकि यहां कनेक्शन स्ट्रिंग का उपयोग ऑपरेशन के रूप में किया जाता है, इसलिए आइए कनेक्शन उपयोगकर्ता को सुरक्षा आदि के विचार में एक समर्पित उपयोगकर्ता बनाने जैसे उपाय करें।

यदि आप इसे appsettings.json पर सेट करते हैं, तो रूट सेक्शन (एक ऑब्जेक्ट, बिल्कुल एक अनुभाग नहीं) में एक कनेक्शनस्ट्रिंग अनुभाग बनाएं। इसमें चाबियों और मूल्यों का एक सेट बनाएं। चाबी का नाम कुछ भी हो सकता है, लेकिन बाद में इसका इस्तेमाल किया जाएगा। मूल्य एक कनेक्शन स्ट्रिंग निर्दिष्ट करता है।

{
  // 

  "ConnectionStrings": {
    "TestDatabaseDbContext": "Data Source=ServerName\\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
  }
}

एंटिटी फ्रेमवर्क कोर को कार्यक्रमों के लिए उपलब्ध कराएं

यह कोर-विशिष्ट प्रसंस्करण ASP.NET। (यदि आप इसे अनुकूलित करते हैं, तो आप इसे अन्य .NET कोर ऐप्स में उपयोग कर सकते हैं, लेकिन ASP.NET आप इसे कोर के लिए डिफ़ॉल्ट रूप से संभाल सकते हैं।

कोर ASP.NET, प्रत्येक उदाहरण में एक जीवित रहने का समय होता है, जो कंसोल और डेस्कटॉप ऐप्स से अलग होता है। उदाहरण के लिए, "जब से वेब सेवा शुरू नहीं हो जाती है तब तक इसे बंद कर दिया जाता है" या "अनुरोध प्राप्त होने के समय से जब तक प्रतिक्रिया वापस नहीं आ जाती है"। ASP.NET फ्रेमवर्क कोर, जिसे कोर में रखा जा सकता है, ServiceLifetime.Scoped डिफ़ॉल्ट रूप से निर्दिष्ट करता है। अगर कोई खास वजह नहीं है तो आप इस तरह से रह सकते हैं।

अपने प्रोग्राम को डेटाबेस संदर्भ तक पहुंचने की अनुमति देने के Startup.ConfigureServices लिए, इसे जोड़ें:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
using DatabaseEntityFrameworkCoreMvc.Models.Database;

// 追加
using Microsoft.EntityFrameworkCore;

public class Startup
{
  // 省略

  // このメソッドはランタイムによって呼び出されます。 このメソッドを使用して、コンテナーにサービスを追加します。
  public void ConfigureServices(IServiceCollection services)
  {
    // 省略

    // 追加
    services.AddDbContext<TestDatabaseDbContext>(
      options => options.UseSqlServer(Configuration.GetConnectionString("TestDatabaseDbContext")));
  }

  // 省略

services.AddDbContext<TestDatabaseDbContext> विधि का प्रकार तर्क आपके द्वारा बनाए गए संदर्भ वर्ग को निर्दिष्ट करता है।

options.UseSqlServer विधि इंगित करती है कि एसक्यूएल सर्वर का उपयोग किया जाता है।

Configuration.GetConnectionString("TestDatabaseDbContext") appsettings.json के साथ पंजीकृत प्रमुख नाम निर्दिष्ट करता है।

कोर एमवीसी में ASP.NET उपयोग का मामला

ASP.NET कोर एमवीसी में एंटिटी फ्रेमवर्क कोर का उपयोग करने के कई तरीके हैं।

एक नियंत्रक में di (निर्भरता सम्मिलित) जोड़ें

स्टार्टअप में .cs विधि दर्ज services.AddDbContext करके.cs TestDatabaseDbContext इसे कंट्रोलर में डाला जा सकता है।

डीआई का एक उदाहरण HomeController यह है कि कंस्ट्रक्टर के पास एक ILogger<HomeController> logger तर्क है। यह डीआई द्वारा जोड़ा जाता है। आप TestDatabaseDbContext उसी तरह से सम्मिलित कर सकते हैं।

यदि आप HomeController किसी मौजूदा में जोड़ना चाहते हैं, तो यह इस तरह दिखता है: बेशक, इसे अन्य नियंत्रकों में जोड़ा जा सकता है।

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public HomeController(ILogger<HomeController> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

फिर आप प्रत्येक कार्रवाई में प्राप्त संदर्भ के उदाहरण का उपयोग करके डेटाबेस तक पहुंच सकते हैं।

मामलों का उपयोग करें

निम्नलिखित कोड वह कोड है जो उपयोगकर्ता की लिस्टिंग और नए पंजीकरण को संभालता है। अब से ASP.NET कोर पर, एंटिटी फ्रेमवर्क कोर प्रत्येक के लिए कोड होगा, इसलिए मैं विस्तार से नहीं समझाऊंगा।

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

इसके अलावा, उपयोगकर्ता का अनुरोध समाप्त होने पर संदर्भ स्वचालित रूप से त्याग दिया जाता है।

होमकंट्रोलर.cs

public class HomeController : Controller
{
  private readonly TestDatabaseDbContext _dbContext;

  // 省略

  // ここから追加

  /// <summary>
  /// ユーザー一覧表示アクション。
  /// </summary>
  public IActionResult List()
  {
    // データベースから User 一覧を取得する
    var users = _dbContext.Users.ToList();
    
    // ビューに渡す
    return View(users);
  }
  
  /// <summary>
  /// ユーザー一新規登録画面。
  /// </summary>
  public IActionResult Create()
  {
    return View();
  }
  
  /// <summary>
  /// ユーザー新規登録処理。
  /// </summary>
  [HttpPost]
  public IActionResult Create(User user)
  {
    // エラーがある場合は登録画面に戻る
    if (ModelState.IsValid == false) View(user);
    
    // 更新日時設定
    user.UpdateDateTime = DateTime.Now;

    // 登録リストにユーザー追加
    _dbContext.Users.Add(user);

    // 登録を確定する
    _dbContext.SaveChanges();
    
    // 一覧画面に遷移
    return RedirectToAction(nameof(List));
  }

  // ここまで追加

  // 省略
}

चूंकि स्क्रीन को मैन्युअल रूप से बनाना परेशानी है, इसलिए सूची स्क्रीन स्वचालित रूप से मचान द्वारा उत्पन्न होती है।

Views/Home/List.cshtmlऑटो जनित इस प्रकार है:

@model IEnumerable<DatabaseEntityFrameworkCoreMvc.Models.Database.User>

@{
  ViewData["Title"] = "List";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>List</h1>

<p>
  <a asp-action="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
@foreach (var item in Model) {
    <tr>
      <td>
        @Html.DisplayFor(modelItem => item.ID)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Name)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Password)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Age)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Email)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Birthday)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.UpdateDateTime)
      </td>
      <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
      </td>
    </tr>
}
  </tbody>
</table>

Index.cshtml सूची में स्क्रीन संक्रमण का लिंक जोड़ें।

<!-- 省略 -->

<ul>
  <li><a asp-action="List">List</a></li>
</ul>

यूजर रजिस्ट्रेशन स्क्रीन भी अपने आप जेनरेट हो जाती है।

Views/Home/Create.cshtmlऑटो जनित इस प्रकार है: यह है के रूप में उपयोग करने के लिए मुश्किल है, तो मैं इसे थोड़ा तय किया है ।

@model DatabaseEntityFrameworkCoreMvc.Models.Database.User

@{
  ViewData["Title"] = "Create";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Password" class="control-label"></label>
        <input asp-for="Password" class="form-control" type="password" /> <!-- type="password" 追加 -->
        <span asp-validation-for="Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Age" class="control-label"></label>
        <input asp-for="Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Email" class="control-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Birthday" class="control-label"></label>
        <input asp-for="Birthday" class="form-control" type="date" /> <!-- type="date" 追加 -->
        <span asp-validation-for="Birthday" class="text-danger"></span>
      </div>
      @* 更新日時は入力しないのでコメントアウト *@
      @*
      <div class="form-group">
        <label asp-for="UpdateDateTime" class="control-label"></label>
        <input asp-for="UpdateDateTime" class="form-control "/>
        <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
      </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
    <a asp-action="List">Back to List</a>  <!-- List に遷移するように変更 -->
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

भागो और पुष्टि करते हैं। वैसे, पासवर्ड पंजीकरण जैसे कोई सुरक्षा उपाय नहीं हैं, इसलिए कृपया ऑपरेटिंग ASP.NET कोर और डेटाबेस पंजीकरण विधियों का पालन करें।

बेशक, यह डेटाबेस में परिलक्षित होता है।

यह टिप्स संपादन या विलोपन नहीं बनाता है, इसलिए आप सही | के लिए संपादित उपयोग कर सकते हैं विवरण | हटाएं "यह भी एक त्रुटि का कारण बनता है। आप इसे उसी तरह बना सकते हैं जैसे बनाएं, इसलिए इसे आज़माएं। उपरोक्त तीनों प्रक्रियाओं को भी सैंपल कोड में जोड़ा गया है।

अनुरोध सेवाओं से डेटाबेस संदर्भ प्राप्त करें

एक नियंत्रक कंस्ट्रक्टर के लिए di जोड़ना थोड़ा बोझिल हो सकता है क्योंकि आपको इसे उन सभी नियंत्रकों में जोड़ना होगा जिनकी आपको आवश्यकता है। वैकल्पिक रूप से, RequestServices आप से प्राप्त कर सकते हैं ।

यह नमूना कोड में शामिल नहीं है, लेकिन इसे इस प्रकार प्राप्त किया जा सकता है।

/// <summary>
/// ユーザー一覧表示アクション。
/// </summary>
public IActionResult List()
{
  // RequestServices からデータベースコンテキストを取得する
  var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
  
  // データベースから User 一覧を取得する
  var users = dbContext.Users.ToList();
  
  // ビューに渡す
  return View(users);
}

सीधे डेटाबेस संदर्भ बनाएं

इसका इस्तेमाल कंसोल और डेस्कटॉप एप्स में भी किया जाता है । आप बिना किसी समस्या के इस विधि का उपयोग कर सकते हैं। यह सिफारिश नहीं की जाती है क्योंकि लेनदेन का दायरा वेब अनुप्रयोगों में अस्पष्ट हो जाता है जहां एक साथ पहुंच होने की संभावना है। विशेष रूप से, अपडेट अनुरोध-अनुरोध आधार पर वापस नहीं ले जा सकते हैं।

यदि आप इस तरह से डेटाबेस का उपयोग करते DbContext हैं, तो आप प्राप्त करने के लिए एक तकनीक का उपयोग करेंगे।

सबसे पहले, Startup के साथ काम करने के लिए संशोधित करें Configuration static

public class Startup
{
  public Startup(IConfiguration configuration)
  {
    Configuration = configuration;
    ConfigurationStatic = configuration;  // 追加
  }
  
  public IConfiguration Configuration { get; }
  public static IConfiguration ConfigurationStatic { get; private set; }  // 追加

  // 省略
}

TestDatabaseDbContext से प्राप्त एक वर्ग बनाएं TestDatabaseDbContextEx और appsettings.json कनेक्शन स्ट्रिंग सेट करें। यदि आप एक कनेक्शन स्ट्रिंग सेट कर सकते हैं, तो आप एक और विधि ले सकते हैं, जैसे कि इसे एक कंस्ट्रक्टर के माध्यम से गुजरना।

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreMvc.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

यदि आप डेटाबेस तक पहुंचना चाहते हैं, तो व्युत्पन्न कक्षाओं के उदाहरणों को उत्पन्न और उपयोग करें।

/// <summary>
/// ユーザー一覧表示アクション。
/// </summary>
public IActionResult List()
{
  // 派生クラスのデータベースコンテキストのインスタンスを生成する
  using var dbContext = new TestDatabaseDbContextEx();
  
  // データベースから User 一覧を取得する
  var users = dbContext.Users.ToList();
  
  // ビューに渡す
  return View(users);
}

एक कोर रेजर पृष्ठ पर ASP.NET उदाहरण

कोर रेजर पेज पर एंटिटी फ्रेमवर्क कोर का उपयोग करने के कई तरीकों का ASP.NET है।

पृष्ठ मॉडल में di (निर्भरता सम्मिलित) जोड़ें

स्टार्टअप में .cs विधि दर्ज services.AddDbContext करके.cs TestDatabaseDbContext इसे पेज मॉडल में डाला जा सकता है।

डीआई का एक उदाहरण IndexModel यह है कि कंस्ट्रक्टर के पास एक ILogger<IndexModel> logger तर्क है। यह डीआई द्वारा जोड़ा जाता है। आप TestDatabaseDbContext उसी तरह से सम्मिलित कर सकते हैं।

यदि आप IndexModel किसी मौजूदा में जोड़ना चाहते हैं, तो यह इस तरह दिखता है: बेशक, इसे अन्य पृष्ठ मॉडल में जोड़ा जा सकता है।

using DatabaseEntityFrameworkCoreMvc.Models.Database;  // 追加

// 省略

public class IndexModel : PageModel
{
  private readonly ILogger<IndexModel> _logger;
  
  // 追加
  private readonly TestDatabaseDbContext _dbContext;
  
  public IndexModel(ILogger<IndexModel> logger, TestDatabaseDbContext dbContext)  // 追加
  {
    _logger = logger;
    _dbContext = dbContext;  // 追加
  }
  
  // 省略
}

फिर आप प्रत्येक प्रक्रिया में प्राप्त संदर्भ के उदाहरण का उपयोग करके डेटाबेस तक पहुंच सकते हैं।

मामलों का उपयोग करें

निम्नलिखित कोड वह कोड है जो उपयोगकर्ता की लिस्टिंग और नए पंजीकरण को संभालता है। कोर और एंटिटी फ्रेमवर्क कोर दोनों ASP.NET कोड होगा, इसलिए मैं विस्तार में नहीं जाऊंगा। इसके अलावा, उपयोगकर्ता का अनुरोध समाप्त होने पर संदर्भ स्वचालित रूप से त्याग दिया जाता है।

सूची स्क्रीन के लिए एक पेज मॉडल बनाएं।

List.cshtml.cs इस प्रकार है:

using System.Collections.Generic;
using System.Linq;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class ListModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;
    
    /// <summary>
    /// 一覧に表示するためのユーザー一覧を格納します。
    /// </summary>
    public List<User> Users { get; set; }
    
    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public ListModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }
    
    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // データベースからユーザー一覧を取得します。
      Users = _dbContext.Users.ToList();
    }
  }
}

List.cshtml इस प्रकार बनाया गया है:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.ListModel
@{
}

<h1>List</h1>

<p>
  <a asp-page="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Users[0].UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    @foreach (var item in Model.Users)
    {
      <tr>
        <td>
          @Html.DisplayFor(modelItem => item.ID)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Password)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Age)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.Birthday)
        </td>
        <td>
          @Html.DisplayFor(modelItem => item.UpdateDateTime)
        </td>
        <td>
          <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
          <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
          <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
        </td>
      </tr>
    }
  </tbody>
</table>

इसे Index.cshtml में जोड़ें ताकि आप सूची पृष्ठ पर संक्रमण कर सकें।

<!-- 追加 -->
<ul>
  <li><a asp-page="List">List</a></li>
</ul>

एक उपयोगकर्ता पंजीकरण स्क्रीन भी बनाएं।

क्रिएट.cshtml.cs कोड इस प्रकार है:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class CreateModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;

    /// <summary>
    /// 登録するユーザー情報を格納します。
    /// </summary>
    [BindProperty]
    public User UserInfo { get; set; }

    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public CreateModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }

    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // 画面表示時は何もしません。
    }

    /// <summary>
    /// POST が送信されたときに呼ばれる。
    /// </summary>
    public IActionResult OnPost()
    {
      // エラーがある場合は登録画面に戻る
      if (ModelState.IsValid == false) return Page();

      // 更新日時設定
      UserInfo.UpdateDateTime = DateTime.Now;

      // 登録リストにユーザー追加
      _dbContext.Users.Add(UserInfo);

      // 登録を確定する
      _dbContext.SaveChanges();

      // 一覧画面に遷移
      return RedirectToPage("List");
    }
  }
}

इस प्रकार बनाएं.cshtml:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.CreateModel
@{
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="UserInfo.ID" class="control-label"></label>
        <input asp-for="UserInfo.ID" class="form-control" />
        <span asp-validation-for="UserInfo.ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Name" class="control-label"></label>
        <input asp-for="UserInfo.Name" class="form-control" />
        <span asp-validation-for="UserInfo.Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Password" class="control-label"></label>
        <input asp-for="UserInfo.Password" class="form-control" type="password" />
        <span asp-validation-for="UserInfo.Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Age" class="control-label"></label>
        <input asp-for="UserInfo.Age" class="form-control" />
        <span asp-validation-for="UserInfo.Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Email" class="control-label"></label>
        <input asp-for="UserInfo.Email" class="form-control" />
        <span asp-validation-for="UserInfo.Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Birthday" class="control-label"></label>
        <input asp-for="UserInfo.Birthday" class="form-control" type="date" />
        <span asp-validation-for="UserInfo.Birthday" class="text-danger"></span>
      </div>
      @*
        <div class="form-group">
          <label asp-for="UpdateDateTime" class="control-label"></label>
          <input asp-for="UpdateDateTime" class="form-control" />
          <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
        </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-page="List">Back to List</a>
</div>

भागो और पुष्टि करते हैं। वैसे, पासवर्ड पंजीकरण जैसे कोई सुरक्षा उपाय नहीं हैं, इसलिए कृपया ऑपरेटिंग ASP.NET कोर और डेटाबेस पंजीकरण विधियों का पालन करें।

बेशक, यह डेटाबेस में परिलक्षित होता है।

मैंने कोई संपादन या विलोपन नहीं बनाया, इसलिए मैं | संपादित नहीं करना चाहता विवरण | हटाएं "यह भी एक त्रुटि का कारण बनता है। आप इसे उसी तरह बना सकते हैं जैसे बनाएं, इसलिए इसे आज़माएं। उपरोक्त तीनों प्रक्रियाओं को भी सैंपल कोड में जोड़ा गया है।

अनुरोध सेवाओं से डेटाबेस संदर्भ प्राप्त करें

पेज मॉडल कंस्ट्रक्टर में डि जोड़ना थोड़ा बोझिल है क्योंकि आपको इसे उन सभी पेज मॉडल में जोड़ना होगा जिनकी आपको आवश्यकता है। वैकल्पिक रूप से, RequestServices आप से प्राप्त कर सकते हैं ।

यह नमूना कोड में शामिल नहीं है, लेकिन इसे इस प्रकार प्राप्त किया जा सकता है।

/// <summary>
/// ページにアクセスされたときに呼ばれます。
/// </summary>
public void OnGet()
{
  // RequestServices からデータベースコンテキストを取得する
  var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
  
  // データベースからユーザー一覧を取得します。
  Users = dbContext.Users.ToList();
}

सीधे डेटाबेस संदर्भ बनाएं

इसका इस्तेमाल कंसोल और डेस्कटॉप एप्स में भी किया जाता है । आप बिना किसी समस्या के इस विधि का उपयोग कर सकते हैं। यह सिफारिश नहीं की जाती है क्योंकि लेनदेन का दायरा वेब अनुप्रयोगों में अस्पष्ट हो जाता है जहां एक साथ पहुंच होने की संभावना है। विशेष रूप से, अपडेट अनुरोध-अनुरोध आधार पर वापस नहीं ले जा सकते हैं।

यदि आप इस तरह से डेटाबेस का उपयोग करते DbContext हैं, तो आप प्राप्त करने के लिए एक तकनीक का उपयोग करेंगे।

सबसे पहले, Startup के साथ काम करने के लिए संशोधित करें Configuration static

public class Startup
{
  public Startup(IConfiguration configuration)
  {
    Configuration = configuration;
    ConfigurationStatic = configuration;  // 追加
  }
  
  public IConfiguration Configuration { get; }
  public static IConfiguration ConfigurationStatic { get; private set; }  // 追加

  // 省略
}

TestDatabaseDbContext से प्राप्त एक वर्ग बनाएं TestDatabaseDbContextEx और appsettings.json कनेक्शन स्ट्रिंग सेट करें। यदि आप एक कनेक्शन स्ट्रिंग सेट कर सकते हैं, तो आप एक और विधि ले सकते हैं, जैसे कि इसे एक कंस्ट्रक्टर के माध्यम से गुजरना।

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreRazor.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

यदि आप डेटाबेस तक पहुंचना चाहते हैं, तो व्युत्पन्न कक्षाओं के उदाहरणों को उत्पन्न और उपयोग करें।

/// <summary>
/// ページにアクセスされたときに呼ばれます。
/// </summary>
public void OnGet()
{
  // 派生クラスのデータベースコンテキストのインスタンスを生成する
  using var dbContext = new TestDatabaseDbContextEx();
    
  // データベースからユーザー一覧を取得します。
  Users = dbContext.Users.ToList();
}