ASP.NET Datenbanken mithilfe von Entity Framework Core in Core

Erstellungsdatum der Seite :

Umgebung

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.1 (MVC, Razor-Seite)
SQL Server
  • Express 2019

Zunächst

In diesen Tipps ASP.NET Schritte, um Entity Framework Core mithilfe des folgenden Core-Ansatzes zu verwenden.

Das Erstellen einer Datenbank, die Verwendung von Entity Framework Core usw. steht nicht im Mittelpunkt dieser Tipps, daher werden wir nicht in sdetails Details gehen. Sie ASP.NET auf die gleiche Weise außerhalb von Core verwendet.

Diesmal wird sql Server auf einem anderen Server installiert und durch die SQL Server-Authentifizierung verbunden. Der einzige Unterschied zur Windows-Authentifizierung, die während einer lokalen Installation verwendet wird, ist die Verbindungszeichenfolge, und es gibt keinen Unterschied im Programm.

Erstellen einer Datenbanktabelle

In diesen Tipps wird SQL Server verwendet. Installieren Sie SQL Server in Ihrer lokalen Umgebung oder auf einem beliebigen Server.

Wenn Sie keine Datenbank zum Testen haben, erstellen Sie eine Datenbank.

Wenn Sie in SQL erstellen, z. B. den folgenden, ändern Sie den SQL Server-Versionspfad und den Datenbanknamen entsprechend Ihrer Umgebung.

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

Erstellen Sie eine Tabelle zum Testen. Legen Sie den Primärschlüssel für Aktualisierungen und Löschungen fest.

Wenn Sie es in SQL erstellen möchten:

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

Fügen Sie einen Datensatz für die Anzeige hinzu.

Wenn Sie es in SQL hinzufügen möchten:

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-Entitätsframework, das in Core verfügbar ist

Dieses Element ist sowohl auf MVC- als auch auf Razor-Seiten üblich.

Paketinstallation von Entity Framework Core

Nachdem Sie Ihr Projekt erstellt haben, erhalten Sie das Paket von NuGet, damit Sie Entity Framework Core zuerst verwenden können. MVC ist ein Beispiel, aber der Vorgang ist auf Rasiermesserseiten identisch.

Klicken Sie mit der rechten Maustaste auf Abhängigkeiten aus dem Projekt, und wählen Sie NuGet-Pakete verwalten aus.

Wenn Browse auf der Registerkarte ausgewählt ist, geben Sie EntityFrameworkCore in das Suchfeld ein. Die Entity Framework Core-bezogenen Pakete werden in der Liste angezeigt.

Ab diesem Zeitpunkt verwende ich SQL Server, daher werde ich die folgenden Pakete installieren.

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

Lassen Sie uns Microsoft.EntityFrameworkCore als Beispiel installieren, also installieren Sie auch die anderen beiden.

Wählen Sie aus, was Sie installieren möchten, und klicken Sie dann auf die Schaltfläche Installieren. Die Version wählt den neuesten Stabilisator aus.

Das Dialogfeld ist grundsätzlich in Ordnung, um auf OK zu klicken.

Installieren Sie auch die anderen beiden.

Ich denke, das Paket sieht wie folgt aus.

Erstellen eines Modells (Programms) aus einer Datenbanktabellenkonfiguration

Wenn Sie Daten aus einer Datenbank in Entity Framework Core abrufen oder aktualisieren möchten, In der Regel müssen Sie ein Programm erstellen, das auf der Tabellenkonfiguration basiert. Dieses Modell wird auch als Aliasentität bezeichnet.

Wenn Sie ein Modell erstellen, codezuerst, eine Technik zum Erstellen von Tabellen in einer Datenbank aus einem Modell (Programm) oder Es gibt zuerst eine Datenbank, die eine Technik zum Erstellen von Modellen (Programmen) aus Tabellen ist. Hier ist eine einfache Datenbank-erste Möglichkeit, automatisch aus einer Tabelle zu programmieren.

Übrigens sind diese Schritte ASP.NET, sodass Sie sie auf die gleiche Weise in der Konsole oder Desktop-App erstellen können.

Erstellen Sie das Projekt zunächst, um sicherzustellen, dass keine Fehler auftreten. Wenn ein Fehler auftritt, kann das Modell nicht erstellt werden. Sie müssen es nicht bauen, wenn Sie bereits überprüft haben, dass keine Fehler vorliegen.

Öffnen Sie in Visual Studio die Package Manager-Konsole. Andernfalls können Sie es über die Tools NuGet Package Manager und Package Manager-Konsolen im Menü öffnen.

Sie sehen ein Fenster ähnlich dem unten, also stellen Sie sicher, dass das Standardprojekt oben rechts das Projekt ist, das Sie modellieren möchten. (Sie müssen vorsichtig sein, wenn Sie mehrere Projekte haben)

Geben Sie im Eingabefeld den folgenden Text ein: Die Parameter variieren je nach Umgebung, daher ändern Sie sie bitte rechtzeitig in die folgende Beschreibung. (insbesondere dort, wo es ***** ist)

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

Ein Bindestrich, -Provider z. B. am Kopf jedes Namens, ist der Parametername, gefolgt vom Wert dieses Parameters.

Parameterbeschreibung Parameterbeispiel
Anbieter Behoben in Microsoft.EntityFrameworkCore.SqlServer SQL Server. Microsoft.EntityFrameworkCore.SqlServer
Verbindung Verbindungszeichenfolge zum Herstellen einer Verbindung mit der Datenbank. Verbindungszeichenfolgen können in anderen gemeinsamen Apps verwendet werden, also schreiben Sie bitte, was Sie entsprechend der Verbindungszeichenfolge kineki angeben. Sowohl die Windows-Authentifizierung als auch die SQL Server-Authentifizierung sind verfügbar. Übrigens wird es nur vorübergehend zum Erstellen eines Modells verwendet, sodass Sie sich der Sicherheit nach der Veröffentlichung der App für diese Verbindungszeichenfolge nicht bewusst sein müssen. Hüten Sie sich vor der Flucht, wenn Sie ein Symbol in Ihrem Passwort haben. "Datenquelle=Servername-SQLEXPRESS;Database=TestDatabase;user id=UserName;password=***********"
F Erzwingen Sie das Überschreiben, auch wenn bereits ein Programm vorhanden ist. <Nein >
OutputDir Der Ordnerpfad, für den der Code ausgegeben wird. Relativer Pfad aus dem Projektordner Modelle- und Datenbank
Kontext Kontextklassenname bei Verwendung des Entity Framework TestDatabaseDbContext
UseDatabaseNames Wenn angegeben, wird der Tabellenname der Datenbank zum Klassennamen, wie er ist. Andernfalls werden die Groß-/Kleinschreibung und die Mehrfachform des Entitätsklassennamens entsprechend den Regeln angepasst. <Nein >
Dataannotations Wenn angegeben, fügt der Spaltentyp das DataAnnotation-Attribut automatisch an jede Eigenschaft an. Dies ist etwas nützlich, wenn Sie die Eingabe automatisch entsprechend dem Typ der Datenbank überprüfen möchten. <Nein >

Wenn Sie die Eingabetaste drücken, um sie auszuführen, wird automatisch Code wie folgt generiert:

Der Modellcode für die Tabelle Benutzer lautet wie folgt:

[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; }
}

Übrigens wird die Warnung angezeigt, da die Verbindungszeichenfolge im Code der generierten Kontextklasse wie sie aufgeführt ist. Achten Sie darauf, die Methoden in dieser Kontextklasse zu löschen, OnConfiguring nachdem der Code generiert wurde.

Registrieren von Verbindungszeichenfolgen

Dies ASP.NET kernspezifische Verarbeitung. (Wenn Sie es anpassen, können Sie es in anderen .NET Core-Apps verwenden, aber ASP.NET Sie es standardmäßig für Core verarbeiten können.)

Die in der Package Manager-Konsole angegebene Verbindungszeichenfolge wurde nur zum Generieren des Modells verwendet.

Die Verbindungszeichenfolge zum Herstellen einer Verbindung mit der Datenbank als Web-App wird in appsettings.json aufgeführt. Wenn Sie das Datenbankziel ändern möchten, mit dem für jeden Build oder jede Publikation eine Verbindung hergestellt werden soll, können Sie appsettings verwenden. Es kann auch von Development.json, etc. verzweigt werden.

Da die Verbindungszeichenfolge hier als Operation verwendet wird, sollten wir Maßnahmen ergreifen, z. B. den Verbindungsbenutzer unter Berücksichtigung der Sicherheit usw. zu einem dedizierten Benutzer machen.

Wenn Sie es auf appsettings.json festlegen, erstellen Sie einen ConnectionStrings-Abschnitt im Stammabschnitt (ein Objekt, nicht genau ein Abschnitt). Erstellen Sie einen Satz von Schlüsseln und Werten darin. Der Name des Schlüssels kann alles sein, aber er wird später verwendet. Der Wert gibt eine Verbindungszeichenfolge an.

{
  // 

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

Entity Framework Core für Programme verfügbar machen

Dies ASP.NET kernspezifische Verarbeitung. (Wenn Sie es anpassen, können Sie es in anderen .NET Core-Apps verwenden, aber ASP.NET Sie es standardmäßig für Core verarbeiten können.)

ASP.NET Core hat jede Instance eine Überlebenszeit, die sich von Konsolen und Desktop-Apps unterscheidet. Beispiel: "Ab dem Zeitpunkt, an dem der Webdienst gestartet wird, bis er beendet wird" oder "vom Zeitpunkt des Empfangens der Anforderung bis zur Rückgabe der Antwort". ASP.NET Framework Core, das in The Core platziert werden kann, ServiceLifetime.Scoped gibt standardmäßig an. Wenn es keinen besonderen Grund gibt, können Sie so bleiben.

Um Ihrem Programm den Zugriff auf den Datenbankkontext zu ermöglichen, fügen Sie es hinzu Startup.ConfigureServices zu:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Das Typargument der Methode gibt die von Ihnen erstellte Kontextklasse an.

options.UseSqlServer Die Methode gibt an, dass sql server verwendet wird.

Configuration.GetConnectionString("TestDatabaseDbContext") gibt den Schlüsselnamen an, der bei appsettings.json registriert ist.

ASP.NET Anwendungsfall in Core MVC

ASP.NET sind mehrere Möglichkeiten, Entity Framework Core in Core MVC zu verwenden.

Hinzufügen von di (Abhängigkeitseinsatz) zu einem Controller

Durch die Registrierung .cs services.AddDbContext Methode beim Start.cs TestDatabaseDbContext Es kann in den Controller eingesetzt werden.

Ein Beispiel für DI HomeController ist, dass der Konstruktor ein ILogger<HomeController> logger Argument hat. Dies wird durch DI hinzugefügt. Sie können TestDatabaseDbContext auf die gleiche Weise einfügen.

Wenn Sie HomeController einer vorhandenen hinzufügen möchten, sieht es wie folgt aus: Natürlich kann es anderen Controllern hinzugefügt werden.

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;  // 追加
  }
  
  // 省略
}

Sie können dann auf die Datenbank zugreifen, indem Sie die Instanz des empfangenen Kontexts in jeder Aktion verwenden.

Anwendungsfälle

Der folgende Code ist der Code, der Benutzerauflistungen und neue Registrierungen verarbeitet. Von nun an ASP.NET Kern, Entity Framework Core wird Code für jeden sein, so dass ich nicht im Detail erklären.

Das vom Entitätsframework-Kern generierte Modell kann weiterhin als Modell für Aktionen verwendet werden. Sie können auch ein separates Modell erstellen und das Entity Framework Core-Modell umschließen und verwenden.

Außerdem wird der Kontext automatisch verworfen, wenn die Anforderung des Benutzers beendet ist.

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

  // ここまで追加

  // 省略
}

Da es schwierig ist, den Bildschirm manuell zu erstellen, wird der Listenbildschirm automatisch durch Gerüste generiert.

Die Views/Home/List.cshtml automatisch generierte ist wie folgt:

@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 Fügen Sie einen Link zum Bildschirmübergang zur Liste hinzu.

<!-- 省略 -->

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

Der Benutzerregistrierungsbildschirm wird ebenfalls automatisch generiert.

Die Views/Home/Create.cshtml automatisch generierte ist wie folgt: Es ist schwierig zu bedienen, wie es ist, also habe ich es ein wenig behoben.

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

Ausführen und bestätigen. Übrigens gibt es keine Sicherheitsmaßnahmen wie Passwort-Registrierung, also folgen Sie bitte ASP.NET Core- und Datenbankregistrierungsmethoden beim Betrieb.

Natürlich spiegelt es sich in der Datenbank wider.

Diese Tipps erstellen keine Bearbeitungen oder Löschungen, sodass Sie die Bearbeitung nach rechts verwenden können, | Einzelheiten | Delete" verursacht auch einen Fehler. Sie können es auf die gleiche Weise wie Erstellen erstellen, also versuchen Sie es. Die oben genannten drei Prozesse wurden ebenfalls dem Beispielcode hinzugefügt.

Abrufen des Datenbankkontexts von RequestServices

Das Hinzufügen von di zu einem Controllerkonstruktor kann etwas umständlich sein, da Sie es allen Controllern hinzufügen müssen, die Sie benötigen. Alternativ RequestServices können Sie von erhalten.

Es ist nicht im Beispielcode enthalten, kann aber wie folgt abgerufen werden.

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

Erstellen eines Datenbankkontexts direkt

Es wird auch in Konsolen und Desktop-Apps verwendet. Sie können diese Methode problemlos verwenden. Es wird nicht empfohlen, da der Umfang von Transaktionen in Webanwendungen, in denen der gleichzeitige Zugriff wahrscheinlich auftritt, tendenziell mehrdeutig ist. Insbesondere können Aktualisierungen möglicherweise nicht auf eine Anforderungsbasis zurückgesetzt werden.

Wenn Sie auf diese Weise auf die Datenbank zugreifen, DbContext verwenden Sie eine Technik zum Ableiten von .

Ändern Sie zunächst Startup die, um mit zu Configuration static arbeiten.

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

  // 省略
}

TestDatabaseDbContext Erstellen Sie eine TestDatabaseDbContextEx Klasse, die von der Verbindungszeichenfolge appsettings.json abgeleitet ist, und legen Sie sie fest. Wenn Sie eine Verbindungszeichenfolge festlegen können, können Sie eine andere Methode verwenden, z. B. die Übergabe durch einen Konstruktor.

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

Wenn Sie auf die Datenbank zugreifen möchten, generieren und verwenden Sie Instanzen der abgeleiteten Klassen.

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

ASP.NET Beispiel auf einer Core Razor-Seite

ASP.NET mehrere Möglichkeiten, Entity Framework Core auf einer Core Razor-Seite zu verwenden.

Hinzufügen von di (Abhängigkeitseinfügung) zum Seitenmodell

Durch die Registrierung .cs services.AddDbContext Methode beim Start.cs TestDatabaseDbContext Sie kann in ein Seitenmodell eingefügt werden.

Ein Beispiel für DI IndexModel ist, dass der Konstruktor ein ILogger<IndexModel> logger Argument hat. Dies wird durch DI hinzugefügt. Sie können TestDatabaseDbContext auf die gleiche Weise einfügen.

Wenn Sie IndexModel einer vorhandenen hinzufügen möchten, sieht es wie folgt aus: Natürlich kann es anderen Seitenmodellen hinzugefügt werden.

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;  // 追加
  }
  
  // 省略
}

Sie können dann auf die Datenbank zugreifen, indem Sie die Instanz des Kontexts verwenden, den Sie in jedem Prozess empfangen haben.

Anwendungsfälle

Der folgende Code ist der Code, der Benutzerauflistungen und neue Registrierungen verarbeitet. Sowohl ASP.NET Core als auch Entity Framework Core sind Code, daher werde ich nicht ins Detail gehen. Außerdem wird der Kontext automatisch verworfen, wenn die Anforderung des Benutzers beendet ist.

Erstellen Sie ein Seitenmodell für den Listenbildschirm.

List.cshtml.cs wie folgt:

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 wird wie folgt erstellt:

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

Fügen Sie es Index.cshtml hinzu, damit Sie zur Listenseite wechseln können.

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

Erstellen Sie auch einen Benutzerregistrierungsbildschirm.

Create.cshtml.cs Code wie folgt:

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 wie folgt:

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

Ausführen und bestätigen. Übrigens gibt es keine Sicherheitsmaßnahmen wie Passwort-Registrierung, also folgen Sie bitte ASP.NET Core- und Datenbankregistrierungsmethoden beim Betrieb.

Natürlich spiegelt es sich in der Datenbank wider.

Ich habe keine Bearbeitungen oder Löschungen erstellt, daher möchte ich nicht, dass die Bearbeitung | Einzelheiten | Delete" verursacht auch einen Fehler. Sie können es auf die gleiche Weise wie Erstellen erstellen, also versuchen Sie es. Die oben genannten drei Prozesse wurden ebenfalls dem Beispielcode hinzugefügt.

Abrufen des Datenbankkontexts von RequestServices

Das Hinzufügen von di zu einem Seitenmodellkonstruktor ist etwas umständlich, da Sie es allen Seitenmodellen hinzufügen müssen, die Sie benötigen. Alternativ RequestServices können Sie von erhalten.

Es ist nicht im Beispielcode enthalten, kann aber wie folgt abgerufen werden.

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

Erstellen eines Datenbankkontexts direkt

Es wird auch in Konsolen und Desktop-Apps verwendet. Sie können diese Methode problemlos verwenden. Es wird nicht empfohlen, da der Umfang von Transaktionen in Webanwendungen, in denen der gleichzeitige Zugriff wahrscheinlich auftritt, tendenziell mehrdeutig ist. Insbesondere können Aktualisierungen möglicherweise nicht auf eine Anforderungsbasis zurückgesetzt werden.

Wenn Sie auf diese Weise auf die Datenbank zugreifen, DbContext verwenden Sie eine Technik zum Ableiten von .

Ändern Sie zunächst Startup die, um mit zu Configuration static arbeiten.

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

  // 省略
}

TestDatabaseDbContext Erstellen Sie eine TestDatabaseDbContextEx Klasse, die von der Verbindungszeichenfolge appsettings.json abgeleitet ist, und legen Sie sie fest. Wenn Sie eine Verbindungszeichenfolge festlegen können, können Sie eine andere Methode verwenden, z. B. die Übergabe durch einen Konstruktor.

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

Wenn Sie auf die Datenbank zugreifen möchten, generieren und verwenden Sie Instanzen der abgeleiteten Klassen.

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