ASP.NET databaser med hjälp av Entity Framework Core i Core
Miljö
- Visuell studio
-
- Visual Studio 2019
- ASP.NET kärna
-
- 3.1 (MVC, Rakhyvelsida)
- SQL-server
-
- 2019 Express
Till en början
Det här tipset ASP.NET steg för att använda Entity Framework Core med hjälp av följande kärnmetod.
Att skapa en databas med hjälp av Entity Framework Core och så vidare är inte huvudfokus för dessa tips, så vi kommer inte att gå in på detaljer. De ASP.NET användas på samma sätt utanför Core.
Den här gången installeras SQL Server på en annan server och ansluts med SQL Server-autentisering. Den enda skillnaden från Windows-autentisering som används under en lokal installation är anslutningssträngen och det finns ingen skillnad i programmet.
Skapa en databastabell
I det här tipset används SQL Server. Installera SQL Server i din lokala miljö eller på vilken server som helst.
Om du inte har någon databas för testning skapar du en databas.
Om du skapar i SQL, till exempel följande, ändrar du SQL Server-versionssökvägen och databasnamnet så att det passar din miljö.
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
Skapa en tabell för testning. Ange primärnyckeln för uppdateringar och borttagningar.
Om du vill skapa det i 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
Lägg till en post för visning.
Om du vill lägga till det i 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 etttitetsramverk som är tillgängligt i Core
Det här objektet är vanligt på både MVC- och Razor-sidor.
Paketinstallation av Entity Framework Core
När du har skapat ditt projekt hämtar du paketet från NuGet så att du kan använda Entity Framework Core först. MVC är ett exempel, men åtgärden är densamma på rakbladssidor.
Högerklicka på Beroenden från projektet och välj Hantera NuGet-paket.
När Bläddra har valts på fliken skriver du EntityFrameworkCore i sökfältet. Entitetsramverkets kärnrelaterade paket visas i listan.
Från och med den här tiden kommer jag att använda SQL Server, så jag installerar följande paket.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Verktyg
- Microsoft.EntityFrameworkCore.SqlServer
Låt oss installera Microsoft.EntityFrameworkCore som ett exempel, så installera de andra två också.
Välj vad du vill installera och klicka sedan på installationsknappen. Versionen väljer den senaste stabilisatorn.
Dialogrutan är i princip ok att klicka på ok.
Installera de andra två också.
Jag anser att paketet är följande.
Skapa en modell (program) från en databastabellkonfiguration
Om du vill hämta eller uppdatera data från en databas i Entity Framework Core Du måste vanligtvis skapa ett program som är en modell baserat på tabellkonfigurationen. Den här modellen kallas också en aliasentitet.
När du skapar en modell, kod först, en teknik för att skapa tabeller i en databas från en modell (program) eller Det finns databas först, vilket är en teknik för att skapa modeller (program) från tabeller. Här är ett enkelt databas-första sätt att automatiskt programmera från en tabell.
Förresten är dessa steg ASP.NET kärnan, så att du kan skapa dem i konsol- eller skrivbordsappen på samma sätt.
Bygg först projektet en gång för att se till att det inte finns några fel. Om det finns ett fel kan modellen inte skapas. Du behöver inte bygga den om du redan har verifierat att det inte finns några fel.
Öppna Package Manager-konsolen i Visual Studio. Annars kan du öppna den från verktygen NuGet Package Manager och Package Manager-konsolerna på menyn.
Du ser ett fönster som liknar det nedan, så se till att standardprojektet längst upp till höger är det projekt du vill modellera. (Du måste vara försiktig om du har flera projekt)
Skriv följande text i inmatningsfältet: Parametrarna varierar beroende på miljö, så ändra dem i rätt tid till följande beskrivning. (särskilt där det är ***** i synnerhet)
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=********\SQLEXPRESS;Database=TestDatabase;user id=********;password=**********" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations
En avstavad, -Provider
till exempel i huvudet på varje namn, är parameternamnet, följt av värdet för den parametern.
Parameterexempel | för | parameterbeskrivning |
---|---|---|
Leverantör | Fast i Microsoft.EntityFrameworkCore.SqlServer SQL Server. |
Microsoft.EntityFrameworkCore.SqlServer |
Anslutning | Anslutningssträng för anslutning till databasen. Anslutningssträngar kan användas i andra appar gemensamt, så skriv vad du anger enligt anslutningssträngen kineki. Både Windows-autentisering och SQL Server-autentisering är tillgängliga. Förresten används den bara tillfälligt för att skapa en modell, så du behöver inte vara medveten om säkerheten när appen har publicerats för den här anslutningssträngen. Se upp för att fly om du har en symbol i ditt lösenord. | "Data Source=ServerName\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=*********" |
F | Tvinga överskrivning även om det redan finns ett program. | <Nej > |
UtdataDir | Mappsökvägen som koden matas ut till. Relativ sökväg från projektmapp | Modeller\Databas |
Sammanhang | Kontextklassnamn när du använder Entitetsramverket | TestaDatabaseDbContext |
AnvändaDatabasnamn | Om det anges blir databasens tabellnamn klassnamnet som det är. I annat fall justeras fallet och den flera formen av enhetsklassnamnet enligt reglerna. | <Nej > |
DataAnnotationer | Om det anges lägger kolumntypen automatiskt till attributet DataAnnotation i varje egenskap. Detta är lite användbart om du automatiskt vill kontrollera indata enligt databasens typ. | <Nej > |
Om du trycker på Retur för att köra genereras koden automatiskt enligt följande:
Modellkoden för tabellen Användare är följande:
[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; }
}
Förresten visas varningen eftersom anslutningssträngen visas som den är i koden för den genererade kontextklassen.
Se till att ta OnConfiguring
bort metoderna i den här kontextklassen när koden har genererats.
Registrera anslutningssträngar
Detta ASP.NET en kärnspecifik bearbetning. (Om du anpassar den kan du använda den i andra .NET Core-appar, men ASP.NET kan hantera den som standard för Core.)
Anslutningssträngen som angavs i Package Manager-konsolen användes bara för att generera modellen.
Anslutningssträngen för anslutning till databasen som webbapp visas i appsettings.json. Om du vill ändra databasmålet som du vill ansluta till för varje version eller publikation kan du använda appsettings. Det kan också förgrenas av Development.json, etc.
Dessutom, eftersom anslutningssträngen här används som åtgärd, låt oss vidta åtgärder som att göra anslutningsanvändaren till en dedikerad användare med hänsyn till säkerhet etc.
Om du ställer in det på appsettings.json skapar du avsnittet ConnectionStrings i rotavsnittet (ett objekt, inte exakt ett avsnitt). Skapa en uppsättning nycklar och värden i den. Namnet på nyckeln kan vara vad som helst, men den kommer att användas senare. Värdet anger en anslutningssträng.
{
// 省略
"ConnectionStrings": {
"TestDatabaseDbContext": "Data Source=ServerName\\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
}
}
Göra Entity Framework Core tillgängligt för program
Detta ASP.NET en kärnspecifik bearbetning. (Om du anpassar den kan du använda den i andra .NET Core-appar, men ASP.NET kan hantera den som standard för Core.)
ASP.NET Core har varje instans en överlevnadstid, som skiljer sig från konsoler och skrivbordsappar.
Till exempel "Från det att webbtjänsten startas tills den stoppas" eller "från det att begäran tas emot tills svaret returneras".
ASP.NET Framework Core, som kan placeras i Kärnan, ServiceLifetime.Scoped
anger som standard.
Om det inte finns någon särskild anledning kan du förbli så här.
Om du vill att programmet ska kunna komma åt databaskontexten lägger du Startup.ConfigureServices
till den i:
// 追加 (自前のクラスなので名前空間は適時合わせてください)
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>
Metodens typargument anger den kontextklass som du skapade.
options.UseSqlServer
Metoden anger att SQL-servern används.
Configuration.GetConnectionString("TestDatabaseDbContext")
anger det nyckelnamn som registrerats med appsettings.json.
ASP.NET användningsfall i Core MVC
ASP.NET finns flera sätt att använda Entity Framework Core i Core MVC.
Lägga till di (beroendeinfogning) i en styrenhet
Genom att registrera .cs services.AddDbContext
metod vid start.cs TestDatabaseDbContext
Den kan sättas in i styrenheten.
Ett exempel på DI HomeController
är att konstruktorn har ett ILogger<HomeController> logger
argument.
Detta läggs till av DI. Du kan infoga TestDatabaseDbContext
på samma sätt.
Om du HomeController
vill lägga till i en befintlig ser det ut så här: Naturligtvis kan det läggas till andra styrenheter.
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; // 追加
}
// 省略
}
Du kan sedan komma åt databasen med hjälp av instansen av den mottagna kontexten i varje åtgärd.
Använda ärenden
Följande kod är koden som hanterar användarlistor och nya registreringar. Från och med ASP.NET kommer Entity Framework Core att vara kod för var och en, så jag kommer inte att förklara i detalj.
Den entitet Framework Core-genererade modellen kan fortfarande användas som modell för åtgärder. Du kan också skapa en separat modell och radbryta och använda modellen Entity Framework Core.
Kontexten ignoreras också automatiskt när användarens begäran är över.
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));
}
// ここまで追加
// 省略
}
Eftersom det är besvärligt att skapa skärmen manuellt genereras listskärmen automatiskt av byggnadsställningar.
Den Views/Home/List.cshtml
automatiskt genererade är följande:
@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
Lägg till en länk till skärmövergången i listan.
<!-- 省略 -->
<ul>
<li><a asp-action="List">List</a></li>
</ul>
Skärmen för användarregistrering genereras också automatiskt.
Den Views/Home/Create.cshtml
automatiskt genererade är följande:
Det är svårt att använda som det är, så jag har fixat det lite.
@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");}
}
Spring och bekräfta. Förresten finns det inga säkerhetsåtgärder som lösenordsregistrering, så följ ASP.NET Core och databasregistreringsmetoder när du arbetar.
Naturligtvis återspeglas det i databasen.
Det här tipset skapar inte redigeringar eller borttagningar, så du kan använda redigering till höger | Detaljer | Ta bort" orsakar också ett fel. Du kan skapa den på samma sätt som Skapa, så prova den. Ovanstående tre processer har också lagts till i exempelkoden.
Hämta databaskontext från RequestServices
Att lägga till di i en styrenhetskonstruktör kan vara lite besvärligt eftersom du måste lägga till det i alla styrenheter du behöver.
Alternativt kan RequestServices
du få från .
Den ingår inte i provkoden, men den kan erhållas på följande sätt.
<summary>
ユーザー一覧表示アクション。
</summary>
public IActionResult List()
{
// RequestServices からデータベースコンテキストを取得する
var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
// データベースから User 一覧を取得する
var users = dbContext.Users.ToList();
// ビューに渡す
return View(users);
}
Skapa en databaskontext direkt
Det används också i konsoler och skrivbordsappar. Du kan använda den här metoden utan problem. Det rekommenderas inte eftersom omfattningen av transaktioner tenderar att vara tvetydig i webbprogram där samtidig åtkomst sannolikt kommer att ske. I synnerhet kanske uppdateringar inte kan återställas till en begäran-för-begäran-basis.
Om du öppnar databasen på det här sättet använder DbContext
du en teknik för att härleda .
Ändra först Startup
att arbeta med 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
Skapa en klass TestDatabaseDbContextEx
som härletts från och ställ in anslutningssträngen appsettings.json.
Om du kan ställa in en anslutningssträng kan du använda en annan metod, till exempel att skicka den genom en 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"));
}
}
}
}
Om du vill komma åt databasen genererar och använder du instanser av de härledda klasserna.
<summary>
ユーザー一覧表示アクション。
</summary>
public IActionResult List()
{
// 派生クラスのデータベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContextEx();
// データベースから User 一覧を取得する
var users = dbContext.Users.ToList();
// ビューに渡す
return View(users);
}
ASP.NET exempel på en Core Razor-sida
ASP.NET sätt att använda Entity Framework Core på en Core Razor-sida.
Lägga till di (beroendeinfogning) i sidmodellen
Genom att registrera .cs services.AddDbContext
metod vid start.cs TestDatabaseDbContext
Den kan infogas i en sidmodell.
Ett exempel på DI IndexModel
är att konstruktorn har ett ILogger<IndexModel> logger
argument.
Detta läggs till av DI. Du kan infoga TestDatabaseDbContext
på samma sätt.
Om du IndexModel
vill lägga till i en befintlig ser det ut så här: Naturligtvis kan det läggas till i andra sidmodeller.
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; // 追加
}
// 省略
}
Du kan sedan komma åt databasen med hjälp av instansen av kontexten du fick i varje process.
Använda ärenden
Följande kod är koden som hanterar användarlistor och nya registreringar. Både ASP.NET Core och Entity Framework Core kommer att vara kod, så jag kommer inte att gå in på detaljer. Kontexten ignoreras också automatiskt när användarens begäran är över.
Skapa en sidmodell för listskärmen.
List.cshtml.cs enligt följande:
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 skapas på följande sätt:
@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>
Lägg till den i Index.cshtml så att du kan gå över till listsidan.
<!-- 追加 -->
<ul>
<li><a asp-page="List">List</a></li>
</ul>
Skapa också en användarregistreringsskärm.
Create.cshtml.cs koden enligt följande:
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 enligt följande:
@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>
Spring och bekräfta. Förresten finns det inga säkerhetsåtgärder som lösenordsregistrering, så följ ASP.NET Core och databasregistreringsmetoder när du arbetar.
Naturligtvis återspeglas det i databasen.
Jag har inte skapat några redigeringar eller borttagningar, så jag vill inte att redigeringen ska | Detaljer | Ta bort" orsakar också ett fel. Du kan skapa den på samma sätt som Skapa, så prova den. Ovanstående tre processer har också lagts till i exempelkoden.
Hämta databaskontext från RequestServices
Att lägga till di i en sidmodellkonstruktör är lite besvärligt eftersom du måste lägga till det i alla sidmodeller du behöver.
Alternativt kan RequestServices
du få från .
Den ingår inte i provkoden, men den kan erhållas på följande sätt.
<summary>
ページにアクセスされたときに呼ばれます。
</summary>
public void OnGet()
{
// RequestServices からデータベースコンテキストを取得する
var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
// データベースからユーザー一覧を取得します。
Users = dbContext.Users.ToList();
}
Skapa en databaskontext direkt
Det används också i konsoler och skrivbordsappar. Du kan använda den här metoden utan problem. Det rekommenderas inte eftersom omfattningen av transaktioner tenderar att vara tvetydig i webbprogram där samtidig åtkomst sannolikt kommer att ske. I synnerhet kanske uppdateringar inte kan återställas till en begäran-för-begäran-basis.
Om du öppnar databasen på det här sättet använder DbContext
du en teknik för att härleda .
Ändra först Startup
att arbeta med 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
Skapa en klass TestDatabaseDbContextEx
som härletts från och ställ in anslutningssträngen appsettings.json.
Om du kan ställa in en anslutningssträng kan du använda en annan metod, till exempel att skicka den genom en 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"));
}
}
}
}
Om du vill komma åt databasen genererar och använder du instanser av de härledda klasserna.
<summary>
ページにアクセスされたときに呼ばれます。
</summary>
public void OnGet()
{
// 派生クラスのデータベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContextEx();
// データベースからユーザー一覧を取得します。
Users = dbContext.Users.ToList();
}