ASP.NET قواعد البيانات باستخدام الأساسية إطار الكيان في الأساسية

تاريخ إنشاء الصفحة :

وسط

استوديو مرئي
  • استوديو مرئي 2019
ASP.NET كور
  • 3.1 (MVC، صفحة الشفرة)
ملقم SQL
  • 2019 إكسبريس

في البداية

هذه النصائح ASP.NET الخطوات لاستخدام "الأساسية إطار الكيان" باستخدام النهج الأساسية التالية.

إن إنشاء قاعدة بيانات، باستخدام كيان Framework Core، وما إلى ذلك، ليس هو التركيز الرئيسي لهذه النصائح، لذلك لن ندخل في التفاصيل. ASP.NET استخدامها بنفس الطريقة خارج Core.

هذه المرة، يتم تثبيت ملقم SQL على ملقم مختلف ومتصل بمصادقة SQL Server. الاختلاف الوحيد من مصادقة Windows المستخدمة أثناء تثبيت محلي هو سلسلة الاتصال ولا يوجد اختلاف في البرنامج.

إنشاء جدول قاعدة بيانات

تستخدم هذه التلميحات SQL Server. تثبيت SQL Server في البيئة المحلية أو على أي ملقم.

إذا لم يكن لديك قاعدة بيانات للاختبار، قم بإنشاء قاعدة بيانات.

إذا كنت تقوم بإنشاء في SQL، مثل ما يلي، تغيير مسار إصدار SQL Server واسم قاعدة البيانات لتتناسب مع البيئة الخاصة بك.

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 متوفر في Core

هذا العنصر شائع على كل من صفحات MVC و Razor.

تثبيت حزمة الأساسية إطار عمل الكيان

بمجرد إنشاء مشروعك، احصل على الحزمة من NuGet بحيث يمكنك استخدام Entity Framework Core أولا. MVC هو مثال، ولكن العملية هي نفسها على صفحات الحلاقة.

انقر بزر الماوس الأيمن فوق تبعيات المشروع وحدد إدارة حزم NuGet.

مع استعراض المحددة من علامة التبويب ، اكتب EntityFrameworkCore في حقل البحث. تظهر الحزم المتعلقة ب Core إطار عمل الكيان في القائمة.

من هذا الوقت، وسوف تستخدم SQL Server، لذلك سوف تثبيت الحزم التالية.

  • مايكروسوفت.كيانتفرمورككور
  • مايكروسوفت.كيانتوركورككور.أدوات
  • مايكروسوفت.كيانالوركورككور.SqlServer

دعونا تثبيت Microsoft.EntityFrameworkCore كمثال، حتى تثبيت اثنين آخرين كذلك.

حدد ما تريد تثبيته، ثم انقر فوق زر التثبيت. يحدد الإصدار أحدث مثبت.

الحوار هو موافق أساسا إلى انقر فوق موافق.

تثبيت اثنين آخرين كذلك.

وأعتقد أن الحزمة هي على النحو التالي.

إنشاء نموذج (برنامج) من تكوين جدول قاعدة بيانات

إذا كنت ترغب في استرداد أو تحديث البيانات من قاعدة بيانات في Entity Framework Core، تحتاج عادة إلى إنشاء برنامج طراز يستند إلى تكوين الجدول. ويسمى هذا النموذج أيضا كيان الاسم المستعار.

عند إنشاء طراز أو التعليمات البرمجية أولا تقنية لإنشاء جداول في قاعدة بيانات من طراز (برنامج) أو هناك قاعدة البيانات أولا ، وهو أسلوب لإنشاء نماذج (برامج) من الجداول. إليك طريقة بسيطة لقاعدة البيانات أولا للبرنامج تلقائيا من جدول.

بالمناسبة، يتم ASP.NET هذه الخطوات إلى The Core، حتى تتمكن من إنشائها في وحدة التحكم أو تطبيق سطح المكتب بنفس الطريقة.

أولا، قم ببناء المشروع مرة واحدة للتأكد من عدم وجود أخطاء. إذا كان هناك خطأ، لا يمكن إنشاء النموذج. لا تحتاج إلى بنائه إذا كنت قد تحققت بالفعل من عدم وجود أخطاء.

من Visual Studio، افتح وحدة التحكم إدارة الحزمة. وإلا، يمكنك فتحه من الأدوات NuGet 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 Server. مايكروسوفت.كيانالوركورككور.SqlServer
اتصال سلسلة الاتصال للاتصال بقاعدة البيانات. يمكن استخدام سلاسل الاتصال في تطبيقات أخرى مشتركة ، لذا يرجى كتابة ما تحدده وفقا لسلسلة الاتصال kineki. تتوفر مصادقة Windows ومصادقة SQL Server. بالمناسبة، يتم استخدامه بشكل مؤقت فقط لإنشاء نموذج، لذلك لا تحتاج إلى أن تكون على علم بالأمان بعد نشر التطبيق لسلسلة الاتصال هذه. حذار من الهروب إذا كان لديك رمز في كلمة المرور الخاصة بك. "مصدر البيانات =اسم الخادم\SQLEXPRESS;قاعدة البيانات=TestDatabase;معرف المستخدم=اسم المستخدم;كلمة المرور=********
و فرض الكتابة فوق حتى إذا كان هناك بالفعل برنامج. <لا >
مخرجات دير مسار المجلد الذي يتم إخراج التعليمات البرمجية إليه. المسار النسبي من مجلد المشروع نماذج\قاعدة بيانات
سياق اسم فئة السياق عند استخدام إطار عمل الكيان اختبار قاعدةDbContext
استخدام أسماء قاعدة البيانات إذا تم تحديده، يصبح اسم جدول قاعدة البيانات اسم الفئة كما هو. وإلا، يتم ضبط الحالة والنموذج المتعدد لاسم فئة الكيان وفقا للقواعد. <لا >
بياناتالتنميات إذا تم تحديد نوع العمود تلقائيا إلحاق سمة DataAnnotation إلى كل خاصية. هذا مفيد بعض الشيء إذا كنت تريد التحقق من الإدخال تلقائيا وفقا لنوع قاعدة البيانات. <لا >

سيؤدي الضغط على Enter لتشغيله إلى إنشاء التعليمات البرمجية تلقائيا على النحو التالي:

رمز الطراز لجدول المستخدم كما يلي:

[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.)

تم استخدام سلسلة الاتصال المحددة في وحدة تحكم إدارة الحزمة فقط لإنشاء الطراز.

يتم سرد سلسلة الاتصال للاتصال بقاعدة البيانات كتطبيق ويب في appsettings.json. إذا كنت ترغب في تغيير وجهة قاعدة البيانات للاتصال بكل بناء أو منشور، يمكنك استخدام إعدادات التطبيق. ويمكن أيضا أن تتفرع من قبل Development.json، الخ.

بالإضافة إلى ذلك ، بما أن سلسلة الاتصال هنا تستخدم كعمليات ، فلنتخذ تدابير مثل جعل مستخدم الاتصال مستخدما مخصصا نظرا للأمان وما إلى ذلك.

إذا قمت بتعيينه إلى appsettings.json إنشاء مقطع ConnectionStrings في المقطع الجذر (كائن، وليس مقطع بالضبط). إنشاء مجموعة من المفاتيح والقيم فيه. اسم المفتاح يمكن أن يكون أي شيء، ولكن سيتم استخدامه في وقت لاحق. تحدد القيمة سلسلة اتصال.

{
  // 

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

إتاحة جوهر إطار عمل الكيان للبرامج

هذا ASP.NET معالجة أساسية محددة. (إذا قمت بتخصيصه، يمكنك استخدامه في تطبيقات .NET Core الأخرى، ولكن ASP.NET يمكنك التعامل معه بشكل افتراضي ل Core.)

ASP.NET Core ، كل مثيل له وقت بقاء ، وهو يختلف عن لوحات المفاتيح وتطبيقات سطح المكتب. على سبيل المثال، "من وقت بدء تشغيل خدمة ويب حتى يتم إيقافها" أو "من وقت تلقي الطلب حتى يتم إرجاع الاستجابة". ASP.NET الإطار الأساسي، الذي يمكن وضعه في The 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.

Configuration.GetConnectionString("TestDatabaseDbContext") تحديد اسم المفتاح المسجل مع appsettings.json.

حالة استخدام ASP.NET في Core MVC

ASP.NET هي عدة طرق لاستخدام كيان إطار الأساسية في 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 الأساسية ، وسوف يكون الكيان الأساسية إطار رمز لكل منهما ، لذلك أنا لن أشرح بالتفصيل.

لا يزال من الممكن استخدام نموذج Framework Core الذي تم إنشاؤه كنموذج للإجراءات. يمكنك أيضا إنشاء نموذج منفصل والتفاف واستخدام طراز Entity Framework Core.

أيضا، يتم تجاهل السياق تلقائيا عند طلب المستخدم قد انتهت.

هومكونترولر.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.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 يمكن إدراجها في نموذج صفحة.

مثال على 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 الأساسية و Entity Framework Core رمزا ، لذلك لن أخوض في التفاصيل. أيضا، يتم تجاهل السياق تلقائيا عند طلب المستخدم قد انتهت.

إنشاء نموذج صفحة لشاشة القائمة.

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 التعليمات البرمجية كما يلي:

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

إضافة di إلى منشئ طراز صفحة مرهقة بعض الشيء لأنه يجب إضافته إلى جميع نماذج الصفحات التي تحتاجها. بدلا من ذلك، 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();
}