ASP.NET پایگاه داده ها با استفاده از نهاد چارچوب هسته در هسته

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

محیط

ویژوال استودیو
  • ویژوال استودیو ۲۰۱۹
ASP.NET هسته
  • 3.1 (MVC، صفحه تیغ)
SQL Server
  • ۲۰۱۹ اکسپرس

در ابتدا

این راهنمایی ASP.NET برای استفاده از نهاد چارچوب هسته با استفاده از رویکرد هسته زیر است.

ایجاد یک پایگاه داده، با استفاده از هسته چارچوب نهاد، و به همین دلیل تمرکز اصلی این راهنمایی نیست، بنابراین ما به جزئیات نمی رویم. آنها ASP.NET همان شیوه خارج از هسته استفاده می شود.

این بار سرور SQL بر روی یک سرور متفاوت نصب شده و توسط تأیید هویت SQL Server به هم متصل می شوند. تنها تفاوت از احراز هویت ویندوز مورد استفاده در طول یک نصب محلی رشته اتصال است، و هیچ تفاوتی در برنامه وجود ندارد.

ایجاد جدول پایگاه داده

این نکته از SQL Server استفاده می کند. SQL Server را در محیط محلی یا هر سروری نصب کنید.

اگر شما یک پایگاه داده برای تست ندارد, ایجاد یک پایگاه داده.

اگر شما در حال ایجاد در SQL، مانند موارد زیر، تغییر مسیر نسخه SQL سرور و نام پایگاه داده با توجه به محیط زیست خود را.

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

یک میز برای آزمایش ایجاد کنید. کلید اولیه را برای به روز رسانی ها و حذف ها تنظیم کنید.

اگر می خواهید آن را در SQL ایجاد کنید:

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

یک رکورد برای نمایش اضافه کنید.

اگر می خواهید آن را در SQL اضافه کنید:

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 نهاد موجود در هسته

این مورد به هر دو صفحه MVC و تیغ مشترک است.

نصب بسته هسته چارچوب نهاد

هنگامی که شما پروژه خود را ایجاد کرده اید, دریافت بسته از NuGet به طوری که شما می توانید نهاد چارچوب هسته اول استفاده کنید. MVC یک مثال است، اما عملیات در صفحات تیغ یکسان است.

وابستگي ها را از پروژه راست کلیک کرده و مدیریت بسته های NuGet را انتخاب کنید.

با مرور انتخاب شده از زبانه، نوع EntityFrameworkCore در زمینه جستجو. بسته های مرتبط با هسته چارچوب نهاد در لیست ظاهر می شوند.

از این زمان ، من SQL سرور استفاده کنید ، بنابراین من بسته های زیر را نصب کنید.

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

بیایید Microsoft.EntityFrameworkCore را به عنوان مثال نصب کنیم، بنابراین دو تای دیگر را نیز نصب کنید.

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

گفتگو اساسا خوب است برای کلیک بر روی ok.

دو تای دیگر را هم نصب کنید.

من فکر می کنم که بسته به عنوان زیر است.

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

اگر می خواهید داده ها را از یک پایگاه داده در هسته چارچوب نهاد بازیابی یا به روز کنید، شما معمولا نیاز به ایجاد یک برنامه است که یک مدل بر اساس پیکربندی جدول. این مدل یک نهاد نام مستعار نیز نامیده می شود.

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

به هر حال، این مراحل ASP.NET Core هستند، بنابراین شما می توانید آنها را در کنسول یا برنامه رومیزی به همان شیوه ایجاد کنید.

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

از ویژوال استودیو، کنسول Package Manager را باز کنید. در غیر این صورت می توانید آن را از ابزارها، NuGet Package Manager و کنسول های Package Manager در منو باز کنید.

پنجره ای شبیه به پنجره زیر را خواهید دید، بنابراین مطمئن شوید که پروژه پیش فرض در سمت راست بالا پروژه ای است که می خواهید مدل سازی کنید. (اگر پروژه های متعددی دارید باید مراقب باشید)

در فیلد ورودی، متن زیر را تایپ کنید: پارامترها بسته به محیط متفاوت است، بنابراین لطفا آنها را به موقع به توضیحات زیر تغییر دهید. (به خصوص جایی که آن را به طور خاص)

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 SQL سرور. Microsoft.EntityFrameworkCore.SqlServer
اتصال رشته اتصال برای اتصال به پایگاه داده. رشته های اتصال را می توان در برنامه های دیگر به طور مشترک استفاده می شود، بنابراین لطفا آنچه را که شما با توجه به kineki رشته اتصال مشخص بنویسید. هر دو احراز هویت ویندوز و SQL Server در دسترس هستند. به هر حال، تنها به طور موقت برای ایجاد یک مدل استفاده می شود، بنابراین لازم نیست پس از انتشار برنامه برای این رشته اتصال، از امنیت آگاه باشید. مراقب باشید از فرار اگر شما یک نماد در رمز عبور خود را. "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=******
فاطمه زور بازنویسی حتی اگر در حال حاضر یک برنامه وجود دارد. <نه >
OutputDir مسیر پوشه ای که کد به آن خروجی است. مسیر نسبی از پوشه پروژه مدل ها\پایگاه داده
چهار چوب نام کلاس زمینه هنگام استفاده از چارچوب نهاد TestDatabaseDbContext
UseDatabaseNames در صورت مشخص شدن، نام جدول پایگاه داده همان طور که هست به نام کلاس تبدیل می شود. در غیر این صورت، مورد و شکل چندگانه نام کلاس نهاد بر اساس قوانین تنظیم می شود. <نه >
DataAnnotations در صورت مشخص شدن، نوع ستون به طور خودکار ویژگی DataAnnotation را به هر ویژگی می دهد. این کمی مفید است اگر شما می خواهید به طور خودکار ورودی با توجه به نوع پایگاه داده را بررسی کنید. <نه >

فشار دادن را وارد کنید برای اجرای آن به طور خودکار کد به صورت زیر تولید:

کد مدل جدول کاربر به صورت زیر است:

[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 Core استفاده کنید، اما ASP.NET می توانید آن را به طور پیش فرض برای Core اداره کنید.)

رشته اتصال مشخص شده در کنسول Package Manager تنها برای تولید مدل مورد استفاده قرار گرفت.

رشته اتصال برای اتصال به پایگاه داده به عنوان یک برنامه وب در appsettings. اگر می خواهید مقصد پایگاه داده را برای اتصال به هر ساخت یا انتشار تغییر دهید، می توانید از تنظیم کننده ها استفاده کنید. همچنین می توان آن را توسط Development.هم شاخه، و غیره.

علاوه بر این ، از آنجا که رشته اتصال در اینجا به عنوان عملیات استفاده می شود ، اجازه دهید اقداماتی مانند ساخت کاربر اتصال کاربر اختصاص داده شده در نظر گرفتن امنیت و غیره.

اگر آن را روی appsettings.هم تنظیم کرده اید، یک بخش ConnectionStrings در بخش ریشه ایجاد کنید (یک شی، نه دقیقاً یک بخش). مجموعه ای از کلیدها و مقادیر را در آن ایجاد کنید. نام کلید می تواند هر چیزی باشد، اما بعداً از آن استفاده خواهد شد. مقدار یک رشته اتصال را مشخص می کند.

{
  // 

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

هسته چارچوب نهاد را در دسترس برنامه ها قرار دهد

این ASP.NET هسته خاص است. (اگر آن را سفارشی کنید، می توانید از آن در برنامه های دیگر .NET Core استفاده کنید، اما ASP.NET می توانید آن را به طور پیش فرض برای Core اداره کنید.)

ASP.NET هسته، هر نمونه دارای زمان بقا است، که با کنسول ها و برنامه های رومیزی متفاوت است. به عنوان مثال، "از زمانی که سرویس وب شروع می شود تا زمانی که متوقف می شود" یا "از زمانی که درخواست دریافت می شود تا زمانی که پاسخ برگردانده شود". ASP.NET Core که می تواند در Core قرار گیرد، به طور 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 روش نشان می دهد که از sql server استفاده می شود.

Configuration.GetConnectionString("TestDatabaseDbContext") مشخص نام کلیدی ثبت شده با appsettings..

ASP.NET مورد استفاده در هسته MVC

ASP.NET راه های متعددی برای استفاده از Entity Framework Core در Core MVC وجود دارد.

اضافه کردن di (درج وابستگی) به یک کنترل کننده

با ثبت .cs services.AddDbContext در راه اندازی.cs TestDatabaseDbContext می توان آن را در کنترل کننده وارد کرد.

یک مثال از DI HomeController این است که سازنده یک آر استدلال ILogger<HomeController> logger دارد. این توسط DI اضافه شده است. شما می توانید به 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 هسته ، نهاد چارچوب هسته خواهد شد کد برای هر ، بنابراین من در جزئیات توضیح نمی دهد.

نهاد چارچوب هسته تولید مدل هنوز هم می تواند به عنوان یک مدل برای اقدامات استفاده می شود. همچنین می توانید یک مدل جداگانه ایجاد کنید و مدل Entity Framework Core را بپیچید و از آن استفاده کنید.

همچنین زمانی که درخواست کاربر به پایان رسید، زمینه به طور خودکار دور انداخته می شود.

HomeController.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

اضافه کردن 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.جون را تنظیم کنید. اگر می توانید یک رشته اتصال تنظیم کنید، می توانید روش دیگری مانند عبور از یک سازنده را در پیش گیرید.

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 می توان آن را در یک مدل صفحه قرار داد.

یک مثال از DI IndexModel این است که سازنده یک آر استدلال ILogger<IndexModel> logger دارد. این توسط DI اضافه شده است. شما می توانید به 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>

ایجاد یک صفحه ثبت نام کاربر نیز هست.

Create.cshtml.cs code به این قرار است:

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

Create.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

اضافه کردن دی به یک سازنده مدل صفحه کمی دست و پا گیر است چرا که شما باید آن را به تمام مدل های صفحه شما نیاز دارید اضافه کنید. متناوبا ، شما 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.جون را تنظیم کنید. اگر می توانید یک رشته اتصال تنظیم کنید، می توانید روش دیگری مانند عبور از یک سازنده را در پیش گیرید.

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