ASP.NET מסדי נתונים באמצעות ליבת מסגרת ישויות בליבה

תאריך יצירת דף :

בסביבה

סטודיו חזותי
  • סטודיו ויזואלי 2019
הליבה ASP.NET
  • 3.1 (MVC, דף גילוח)
שרת SQL
  • אקספרס 2019

בהתחלה

עצות אלה ASP.NET שלבים לשימוש בליבת מסגרת הישות באמצעות גישת הליבה הבאה.

יצירת מסד נתונים, באמצעות ליבת מסגרת ישויות וכן הלאה אינם המוקד העיקרי של עצות אלה, כך שלא ניכנס לפרטים. הם ASP.NET בשימוש באותו אופן מחוץ לליבה.

הפעם, שרת SQL מותקן בשרת אחר ומחובר באמצעות אימות שרת SQL. ההבדל היחיד באימות Windows המשמש במהלך התקנה מקומית הוא מחרוזת החיבור, ואין הבדל בתוכנית.

יצירת טבלת מסד נתונים

עצות אלה משתמשות בשרת SQL. התקן שרת SQL בסביבה המקומית שלך או בכל שרת.

אם אין לך מסד נתונים לבדיקה, צור מסד נתונים.

אם אתה יוצר ב- 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 והן לדפי סכין גילוח.

התקנת חבילה של ליבת מסגרת ישות

לאחר שיצרת את הפרוייקט, קבל את החבילה מ- NuGet כדי שתוכל להשתמש תחילה בליבת מסגרת הישות. MVC הוא דוגמה, אך הפעולה זהה בדפי גילוח.

לחץ באמצעות לחצן העכבר הימני על יחסי תלות מהפרוייקט ובחר נהל חבילות NuGet.

כאשר האפשרות עיון נבחרה מהכרטיסיה, הקלד EntityFrameworkCore בשדה החיפוש. החבילות הקשורות לליבה של מסגרת הישות מופיעות ברשימה.

מעתה, אני אשתמש בשרת SQL, אז אני אתקין את החבילות הבאות.

  • מיקרוסופט.תפאורת עבודה במסגרת הישות
  • Microsoft.ישויותמסגרתעבודהמקור.כלים
  • Microsoft.ישותמסגרתעבודהמקור.שרת Sql

בוא נתקין את Microsoft.EntityFrameworkCore כדוגמה, לכן התקן גם את השניים האחרים.

בחר את מה שברצונך להתקין ולאחר מכן לחץ על לחצן ההתקנה. הגרסה בוחרת את המייצב העדכני ביותר.

תיבת הדו-שיח היא בעצם בסדר כדי ללחוץ על אישור.

התקן גם את השניים האחרים.

אני חושב שהחבילה היא כדלקמן.

יצירת מודל (תוכנית) מתצורת טבלת מסד נתונים

אם ברצונך לאחזר או לעדכן נתונים ממסד נתונים בליבת מסגרת הישות, בדרך כלל עליך ליצור תוכנית שהיא מודל המבוסס על תצורת הטבלה. מודל זה נקרא גם ישות כינוי.

בעת יצירת מודל, קוד תחילה, טכניקה ליצירת טבלאות במסד נתונים ממודל (תוכנית), או קיים מסד נתונים תחילה, שהוא טכניקה ליצירת מודלים (תוכניות) מטבלאות. להלן דרך פשוטה של מסד נתונים לתכנת באופן אוטומטי מטבלה.

אגב, שלבים אלה ASP.NET ל- Core, כך שבאפשרותך ליצור אותם ביישום המסוף או שולחן העבודה באותו אופן.

תחילה, בנה את הפרוייקט פעם אחת כדי לוודא שאין שגיאות. אם קיימת שגיאה, אין אפשרות ליצור את המודל. אינך צריך לבנות אותו אם כבר אימתת שאין שגיאות.

מתוך Visual Studio, פתח את מסוף מנהל החבילות. אחרת, באפשרותך לפתוח אותו מהכלים, ממנהל החבילות של NuGet ומסופי מנהל החבילות בתפריט.

תראה חלון דומה לזה שלהלן, לכן ודא שפרוייקט ברירת המחדל בקצה השמאלי העליון הוא הפרוייקט שברצונך לעצב. (עליך להיזהר אם יש לך פרוייקטים מרובים)

בשדה הקלט, הקלד את הטקסט הבא: הפרמטרים משתנים בהתאם לסביבה, לכן שנה אותם בזמן לתיאור הבא. (במיוחד איפה זה ***** בפרט)

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.ישותמסגרתעבודהמקור.שרת Sql
חיבור מחרוזת חיבור להתחברות למסד הנתונים. ניתן להשתמש במחרוזות חיבור ביישומים אחרים במשותף, לכן כתוב את מה שציינת בהתאם למחרוזת החיבור kineki. אימות של Windows ואימות שרת SQL זמינים. אגב, הוא משמש רק באופן זמני ליצירת מודל, כך שאינך צריך להיות מודע לאבטחה לאחר פרסום האפליקציה עבור מחרוזת חיבור זו. היזהר מלברוח אם יש לך סמל בסיסמה שלך. "מקור נתונים=ServerName\SQLEXPRESS;מסד נתונים=TestDatabase;מזהה משתמש=UserName;סיסמה=***********
פ כפה החלפה גם אם כבר קיימת תוכנית. <לא >
פלט דיר נתיב התיקיה שאליו הקוד הוא פלט. נתיב יחסי מתיקיית הפרוייקט מודלים\מסד נתונים
הקשר שם מחלקת הקשר בעת שימוש במסגרת הישות בדיקתדאטה-בייסדבטקסט
השתמש בשמות מסדי נתונים אם צוין, שם הטבלה של מסד הנתונים יהפוך לשם המחלקה כפי שהוא. אחרת, האירוע והצורה המרובות של שם מחלקת הישות יותאמו בהתאם לכללים. <לא >
ביאורי נתונים אם צוין, סוג העמודה מוסיף באופן אוטומטי את התכונה 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. אם ברצונך לשנות את יעד מסד הנתונים שאליו יש להתחבר עבור כל גירסת Build או פרסום, באפשרותך להשתמש ביישומים. זה יכול להיות גם מסועף על ידי פיתוח.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 מסגרת 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 הליבה, ליבת מסגרת ישות יהיה קוד עבור כל, אז אני לא אסביר בפירוט.

עדיין ניתן להשתמש במודל הליבה של מסגרת הישות כמודל לפעולות. באפשרותך גם ליצור מודל נפרד ולעטוף ולהשתמש במודל הליבה של מסגרת הישות.

כמו כן, ההקשר נמחק באופן אוטומטי כאשר בקשת המשתמש הסתיימה.

הום קונטרולר.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 בדף Core Razor

ASP.NET מספר דרכים לשימוש בליבת מסגרת הישות בדף Core Razor.

הוספת 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 וגם ליבת מסגרת הישות יהיו קוד, אז אני לא אכנס לפרטים. כמו כן, ההקשר נמחק באופן אוטומטי כאשר בקשת המשתמש הסתיימה.

צור מודל דף עבור מסך הרשימה.

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>

צור גם מסך רישום משתמש.

צור קוד .cs create.cshtml באופן הבא:

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

הוספת 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();
}