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 ادارہ فریم ورک کور میں دستیاب ہے

یہ شے ایم وی سی اور ریزر دونوں صفحات میں عام ہے۔

ادارہ فریم ورک کور کی پیکج تنصیب

ایک بار جب آپ اپنا پروجیکٹ بنا لیں تو نیو گیٹ سے پیکیج حاصل کریں تاکہ آپ پہلے اینٹیٹی فریم ورک کور استعمال کر سکیں۔ ایم وی سی ایک مثال ہے، لیکن آپریشن ریزر صفحات پر ایک ہی ہے.

پروجیکٹ سے دائیں کلک انحصار اور انتظام نیو گیٹ پیکجمنتخب کریں۔

جدول سے منتخب براؤز کے ساتھ، تلاش قطعہ میں ادارہ فریم ورک کور ٹائپ کریں۔ فہرست میں ادارہ فریم ورک کور سے متعلق پیکجز ظاہر ہوتے ہیں۔

اس وقت سے، میں ایس کیو ایل سرور استعمال کروں گا، لہذا میں مندرجہ ذیل پیکجز انسٹال کروں گا۔

  • مائیکروسافٹ.ادارہ فریم ورک کور
  • مائیکروسافٹ.ادارہ فریم ورک کور.ٹولز
  • مائیکروسافٹ.ادارہ فریم ورک کور.مربع سرور

آئیے ایک مثال کے طور پر مائیکروسافٹ.اینٹی ٹیفریم ورک کور انسٹال کرتے ہیں، لہذا باقی دو کو بھی انسٹال کریں۔

جو آپ تنصیب کرنا چاہتے ہیں اسے منتخب کریں اور پھر تنصیب بٹن پر کلک کریں۔ ورژن تازہ ترین سٹیبلائزر منتخب کرتا ہے۔

مکالمہ بنیادی طور پر ٹھیک ہے ٹھیک ہے پر کلک کرنے کے لئے.

باقی دو بھی انسٹال کریں۔

میرے خیال میں پیکیج درج ذیل ہے۔

کوائفیہ جدول تشکیل سے ایک نمونہ (پروگرام) بنائیں

اگر آپ کوائفیہ سے ڈیٹا کو دوبارہ حاصل کرنا یا اپ ڈیٹ کرنا چاہتے ہیں تو انٹیٹی فریم ورک کور میں، آپ کو عام طور پر ایک پروگرام بنانے کی ضرورت ہے جو جدول تشکیل پر مبنی ایک ماڈل ہو۔ اس ماڈل کو عرفی وجود بھی کہا جاتا ہے۔

جب آپ کوئی ماڈل بناتے ہیں تو پہلے کوڈ کریں، کسی ماڈل (پروگرام) سے ڈیٹا بیس میں جدول بنانے کی تکنیک، یا پہلے ڈیٹا بیس ہے، جو جدولوں سے ماڈل (پروگرام) بنانے کی تکنیک ہے۔ میز سے خود بخود پروگرام کرنے کا ایک آسان ڈیٹا بیس پہلا طریقہ یہ ہے۔

ویسے، یہ اقدامات کور کے 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 ہے۔ مائیکروسافٹ.ادارہ فریم ورک کور.مربع سرور
کنکشن کوائفیہ سے جڑنے کے لیے کنکشن سٹرنگ۔ کنکشن سٹرنگز کو عام طور پر دیگر ایپس میں استعمال کیا جا سکتا ہے، لہذا براہ کرم کنکشن سٹرنگ کینیکی کے مطابق جو آپ واضح کرتے ہیں وہ لکھیں۔ ونڈوز توثیق اور ایس کیو ایل پیش کار توثیق دونوں دستیاب ہیں۔ ویسے، یہ صرف عارضی طور پر ایک ماڈل بنانے کے لئے استعمال کیا جاتا ہے, تو آپ کو اس کنکشن سٹرنگ کے لئے ایپ شائع ہونے کے بعد سیکورٹی سے آگاہ ہونے کی ضرورت نہیں ہے. اگر آپ کے پاس ورڈ میں کوئی علامت ہے تو فرار ہونے سے بچیں۔ "کوائف ماخذ=سرور نام\ایس کیو ایل ایکسپریس;ڈیٹا بیس=ٹیسٹ ڈیٹا بیس;صارف شناخت=صارف نام;پاس ورڈ=**""
ایف اگر پہلے سے ہی کوئی پروگرام موجود ہو تو بھی اوور رائٹنگ پر مجبور کریں۔ >نہیں >
آؤٹ پٹ دیر وہ پوشہ راستہ جس پر کوڈ آؤٹ پٹ ہے۔ منصوبہ پوشہ سے نسبتی راستہ نمونے\کوائفیہ
سیاق ادارہ فریم ورک استعمال کرتے وقت سیاق و سباق کلاس کا نام ٹیسٹ ڈیٹا بیس ڈی بی سیاق و سباق
ڈیٹا بیس نام استعمال کریں اگر اختصاصی ہو تو کوائفیہ کا جدول نام جیسا ہے کلاس نام بن جاتا ہے۔ بصورت دیگر، مقدمہ اور ادارے کے طبقاتی نام کی متعدد شکلوں کو قواعد کے مطابق ایڈجسٹ کیا جاتا ہے۔ >نہیں >
داتا تشریحات اگر اختصاصی ہو تو کالم قسم خود بخود ہر خاصیت پر داتا تشریح وصف کو ضم کر جاتی ہے۔ اگر آپ ڈیٹا بیس کی قسم کے مطابق خود بخود ان پٹ چیک کرنا چاہتے ہیں تو یہ تھوڑا مفید ہے۔ >نہیں >

اسے چلانے کے لیے داخل دبائیں خود بخود کوڈ تیار کریں گے درج ذیل

صارف جدول کے لیے ماڈل کوڈ درج ذیل ہے:

[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۔ (اگر آپ اسے اپنی مرضی کے مطابق بناتے ہیں، تو آپ اسے دیگر .نیٹ کور ایپس میں استعمال کرسکتے ہیں، لیکن ASP.NET آپ اسے کور کے لئے طے شدہ طور پر سنبھال سکتے ہیں۔)

پیکیج منیجر کنسول میں متعین کنکشن سٹرنگ صرف ماڈل تیار کرنے کے لئے استعمال کی گئی تھی۔

ویب ایپ کے طور پر ڈیٹا بیس سے جڑنے کے لئے کنکشن سٹرنگ ایپسیٹنگز ڈاٹ جے سن میں درج ہے۔ اگر آپ ہر تعمیر یا اشاعت کے لیے مربوط کرنے کے لیے ڈیٹا بیس منزل تبدیل کرنا چاہتے ہیں، تو آپ ایپسیٹنگاستعمال کرسکتے ہیں۔ اس کی شاخ ڈویلپمنٹ ڈاٹ جے سن وغیرہ بھی ہو سکتی ہے۔

اس کے علاوہ، چونکہ یہاں کنکشن سٹرنگ کو آپریشن کے طور پر استعمال کیا جاتا ہے، آئیے ایسے اقدامات کرتے ہیں جیسے کنکشن صارف کو سلامتی وغیرہ کے پیش نظر ایک وقف صارف بنانا۔

اگر آپ اسے ایپ سیٹنگز ڈاٹ جے سن پر سیٹ کرتے ہیں تو جڑ کے حصے میں کنکشن سٹرنگز سیکشن بنائیں (ایک آبجیکٹ، بالکل ایک سیکشن نہیں)۔ اس میں کلیدوں اور اقدار کا ایک مجموعہ بنائیں۔ کلید کا نام کچھ بھی ہو سکتا ہے، لیکن اسے بعد میں استعمال کیا جائے گا۔ قدر کنکشن سٹرنگ کی وضاحت کرتی ہے۔

{
  // 

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

ادارہ فریم ورک کور پروگراموں کے لیے دستیاب کرائیں

یہ بنیادی مخصوص پروسیسنگ ASP.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") ایپسیٹنگز ڈاٹ جے سن کے ساتھ رجسٹرڈ کلیدی نام کی وضاحت کرتا ہے۔

کور ایم وی سی میں ASP.NET استعمال کا معاملہ

ASP.NET کور ایم وی سی میں اینٹیٹی فریم ورک کور استعمال کرنے کے کئی طریقے ہیں۔

کنٹرولر میں دی (انحصار داخل) شامل کریں

اسٹارٹ اپ میں .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 کور اور ڈیٹا بیس رجسٹریشن کے طریقوں پر عمل کریں۔

یقینا، یہ ڈیٹا بیس میں ظاہر ہوتا ہے.

یہ تجاویز تدوین یا حذف نہیں کرتی ہیں، لہذا آپ تدوین کو صحیح | تفصیلات | حذف کریں" بھی ایک نقص کا سبب بنتا ہے۔ آپ اسے اسی طرح تخلیق کرسکتے ہیں جس طرح تخلیق کرتے ہیں، لہذا اسے آزمائیں۔ مندرجہ بالا تین عمل کو نمونہ کوڈ میں بھی شامل کیا گیا ہے۔

درخواست خدمات سے ڈیٹا بیس سیاق و سباق حاصل کریں

کنٹرولر کنسٹرکٹر میں ڈی آئی شامل کرنا تھوڑا بوجھل ہوسکتا ہے کیونکہ آپ کو اسے ان تمام کنٹرولرز میں شامل کرنا ہوگا جن کی آپ کو ضرورت ہے۔ متبادل طور پر، 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 اور ایپسیٹنگز.جے سن کنکشن سٹرنگ سیٹ کریں۔ اگر آپ کنکشن سٹرنگ سیٹ کر سکتے ہیں، تو آپ ایک اور طریقہ اختیار کر سکتے ہیں، جیسے کہ اسے کنسٹرکٹر کے ذریعے منتقل کرنا۔

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 کور ریزر پیج پر اینٹیٹی فریم ورک کور استعمال کرنے کے کئی طریقے ہیں۔

صفحہ ماڈل میں دی (انحصار داخل) شامل کریں

اسٹارٹ اپ میں .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 کور اور اینٹیٹی فریم ورک کور دونوں کوڈ ہوں گے، لہذا میں تفصیلات میں نہیں جاؤں گا۔ اس کے علاوہ صارف کی درخواست ختم ہونے پر سیاق و سباق خود بخود مسترد ہو جاتا ہے۔

فہرست سکرین کے لیے صفحہ ماڈل بنائیں۔

فہرست.سی ایس ایچ ٹی ایم .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();
    }
  }
}

فہرست.سی ایس ایچ ٹی ایم ایل درج ذیل تخلیق کیا گیا ہے:

@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>

اسے اشاریہ.سی ایس ایچ ٹی ایم میں شامل کریں تاکہ آپ فہرست صفحہ میں منتقل ہو سکیں۔

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

صارف رجسٹریشن سکرین بھی بنائیں۔

سی ایس ایچ ٹی ایل .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");
    }
  }
}

تخلیق کریں.سی ایس ایچ ٹی ایم ایل درج ذیل ہیں:

@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 اور ایپسیٹنگز.جے سن کنکشن سٹرنگ سیٹ کریں۔ اگر آپ کنکشن سٹرنگ سیٹ کر سکتے ہیں، تو آپ ایک اور طریقہ اختیار کر سکتے ہیں، جیسے کہ اسے کنسٹرکٹر کے ذریعے منتقل کرنا۔

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