duomenų bazių ASP.NET naudojant "Entity Framework Core" pagrindiniame
Aplinkos
- Vizualinė studija
-
- Vizualinė studija 2019
- ASP.NET branduolys
-
- 3.1 (MVC, Skustuvo puslapis)
- SQL serveris
-
- 2019 m. Express
Iš pradžių
Šie patarimai ASP.NET veiksmus, kaip naudoti objekto sistemos branduolį naudojant metodą "Following Core".
Duomenų bazės kūrimas naudojant "Entity Framework Core" ir t. t. nėra pagrindinis šių patarimų akcentas, todėl nesileisime į išsamią informaciją. Jie ASP.NET naudojami taip pat už Core ribų.
Šį kartą SQL serveris įdiegiamas kitame serveryje ir prijungiamas SQL serverio autentifikavimu. Vienintelis skirtumas nuo "Windows" autentifikavimo, naudojamo vietinio diegimo metu, yra jungimosi eilutė, o programoje nėra jokio skirtumo.
Duomenų bazės lentelės kūrimas
Šie patarimai naudoja SQL serverį. Įdiekite SQL serverį vietinėje aplinkoje arba bet kuriame serveryje.
Jei neturite tikrinti skirtos duomenų bazės, sukurkite duomenų bazę.
Jei kuriate SQL, pvz., toliau, pakeiskite SQL serverio versijos kelią ir duomenų bazės pavadinimą, kad jie atitiktų jūsų aplinką.
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
Sukurkite tikrinimo lentelę. Nustatykite pirminį naujinimų ir naikinimų raktą.
Jei norite jį sukurti 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
Įtraukite įrašą rodyti.
Jei norite įtraukti jį į 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 subjekto sistema, prieinama "Core"
Šis elementas yra bendras tiek MVC, tiek Skustuvo puslapiams.
Objekto sistemos branduolio paketo diegimas
Sukūrę projektą, gaukite paketą iš "NuGet", kad pirmiausia galėtumėte naudoti "Entity Framework Core". MVC yra pavyzdys, tačiau operacija yra tokia pati skustuvo puslapiuose.
Dešiniuoju pelės mygtuku spustelėkite Projekto priklausomybės ir pasirinkite Tvarkyti NuGet paketus.
Skirtuke pasirinkus Naršyti, ieškos lauke įveskite EntityFrameworkCore. Sąraše rodomi su objektų sistemos branduoliu susiję paketai.
Nuo to laiko naudosiu SQL serverį, todėl įdiegsiu šiuos paketus.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Įdiekime Microsoft.EntityFrameworkCore kaip pavyzdį, todėl įdiekite ir kitus du.
Pasirinkite, ką norite įdiegti, tada spustelėkite diegimo mygtuką. Versija pasirenka naujausią stabilizatorių.
Dialogas yra iš esmės gerai, kad spustelėkite Gerai.
Įdiekite kitus du taip pat.
Manau, kad paketas yra toks.
Modelio (programos) kūrimas iš duomenų bazės lentelės konfigūracijos
Jei norite nuskaityti arba atnaujinti duomenis iš duomenų bazės objektų sistemos branduolyje, Paprastai reikia sukurti programą, kuri yra modelis pagal lentelės konfigūraciją. Šis modelis taip pat vadinamas pseudonimo objektu.
Kai kuriate modelį, kodą pirmiausia, lentelių kūrimo duomenų bazėje iš modelio (programos) techniką, arba Pirmiausia yra duomenų bazė, kuri yra modelių (programų) kūrimo iš lentelių technika. Štai paprastas duomenų bazės pirmasis būdas automatiškai programuoti iš lentelės.
Beje, šie veiksmai yra ASP.NET į "The Core", todėl galite juos sukurti konsolėje arba darbalaukio programoje tokiu pačiu būdu.
Pirma, sukurkite projektą vieną kartą, kad įsitikintumėte, jog nėra klaidų. Jei įvyko klaida, modelio sukurti negalima. Jums nereikia jo statyti, jei jau patvirtinote, kad nėra klaidų.
"Visual Studio" atidarykite "Package Manager" konsolę. Kitu atveju galite jį atidaryti iš meniu įrankių, "NuGet Package Manager" ir "Package Manager" konsolių.
Pamatysite langą, panašų į toliau pateiktą, todėl įsitikinkite, kad numatytasis projektas viršutiniame dešiniajame krašte yra projektas, kurį norite modeliuoti. (Turite būti atsargūs, jei turite kelis projektus)
Įvesties lauke įveskite šį tekstą: Parametrai skiriasi priklausomai nuo aplinkos, todėl prašome juos laiku pakeisti į šį aprašymą. (ypač ten, kur jis ***** ypač)
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=********\SQLEXPRESS;Database=TestDatabase;user id=********;password=**********" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations
Brūkšnelis, -Provider
pvz., kiekvieno pavadinimo galvoje, yra parametro pavadinimas, po kurio eina to parametro reikšmė.
Parametro | aprašo | parametro pavyzdys |
---|---|---|
Teikėjas | Fiksuotas Microsoft.EntityFrameworkCore.SqlServer SQL serveryje. |
Microsoft.EntityFrameworkCore.SqlServer |
Ryšį | Jungimosi eilutė, skirta prisijungti prie duomenų bazės. Jungimosi eilutės gali būti naudojamos kitose bendrose programose, todėl parašykite tai, ką nurodote pagal jungimosi eilutę kineki. Galimas "Windows" autentifikavimas ir SQL serverio autentifikavimas. Beje, jis naudojamas tik laikinai kuriant modelį, todėl jums nereikia žinoti apie saugumą po to, kai programa bus paskelbta šiai jungimosi eilutei. Saugokitės pabėgti, jei turite simbolį savo slaptažodį. | "Duomenų šaltinis=ServerName\SQLEXPRESS;Duomenų bazė=TestDatabase;vartotojo id=Vartotojo vardas;slaptažodis=**********" |
F | Priverstinis perrašymas, net jei jau yra programa. | <Ne > |
IšvestisDir | Aplanko maršrutas, į kurį išvestas kodas. Santykinis maršrutas iš projekto aplanko | Modeliai\Duomenų bazė |
Kontekste | Konteksto klasės pavadinimas naudojant objektų sistemą | TestDatabaseDbContext |
UseDatabaseNames | Jei nurodyta, duomenų bazės lentelės pavadinimas tampa klasės pavadinimu toks, koks yra. Kitu atveju atvejis ir sudėtin objekto klasės pavadinimo forma koreguojami pagal taisykles. | <Ne > |
DataAnnotations | Jei nurodyta, stulpelio tipas automatiškai pridedamas prie kiekvienos ypatybės atributo DataAnnotation. Tai šiek tiek naudinga, jei norite automatiškai patikrinti įvestį pagal duomenų bazės tipą. | <Ne > |
Paspaudus Enter, kad jį paleistumėte, jis automatiškai sugeneruos kodą taip:
Vartotojo lentelės modelio kodas yra toks:
[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; }
}
Beje, įspėjimas rodomas, nes jungimosi eilutė pateikiama tokia, kokia yra sugeneruotos konteksto klasės kode.
Sugeneravę kodą, būtinai panaikinkite OnConfiguring
šios konteksto klasės metodus.
Registruoti jungimosi eilutes
Tai ASP.NET konkretaus pagrindinio apdorojimo. (Jei jį tinkinsite, galėsite jį naudoti kitose .NET Core programose, bet ASP.NET pagal numatytuosius nustatymus galite tvarkyti jį su Core.)
Paketo tvarkytuvo konsolėje nurodyta jungimosi eilutė buvo naudojama tik modeliui generuoti.
Jungimosi eilutė, skirta prisijungti prie duomenų bazės kaip žiniatinklio programos, pateikiama appsettings.json. Jei norite pakeisti duomenų bazės paskirties vietą, prie kurios norite prisijungti kiekvienai komponavimo versijai ar leidiniui, galite naudoti programėlių nustatymus. Jis taip pat gali būti šakotas Development.json ir tt
Be to, kadangi jungimosi eilutė čia naudojama kaip operacija, imkimės tokių priemonių kaip ryšio vartotojo paveikimas, atsižvelgiant į saugumą ir pan.
Jei nustatysite appsettings.json, šakninėje sekcijoje sukurkite skyrių ConnectionStrings (objektas, ne visai sekcija). Sukurkite jame raktų ir reikšmių rinkinį. Rakto pavadinimas gali būti bet kas, tačiau jis bus naudojamas vėliau. Reikšmė nurodo jungimosi eilutę.
{
// 省略
"ConnectionStrings": {
"TestDatabaseDbContext": "Data Source=ServerName\\SQLEXPRESS;Database=TestDatabase;user id=UserName;password=********"
}
}
Padaryti objekto sistemos branduolį prieinamą programoms
Tai ASP.NET konkretaus pagrindinio apdorojimo. (Jei jį tinkinsite, galėsite jį naudoti kitose .NET Core programose, bet ASP.NET pagal numatytuosius nustatymus galite tvarkyti jį su Core.)
ASP.NET Core" kiekvienas egzempliorius turi išgyvenimo laiką, kuris skiriasi nuo konsolių ir darbalaukio programų.
Pavyzdžiui, "Nuo to laiko, kai paleidžiama tinklo tarnyba, kol ji sustabdoma" arba "nuo užklausos gavimo iki atsakymo grąžinimo".
ASP.NET sistemos branduolys, kurį galima įdėti į "The Core", ServiceLifetime.Scoped
nurodo pagal numatytuosius nustatymus.
Jei nėra ypatingos priežasties, galite likti tokiu būdu.
Jei norite leisti programai pasiekti duomenų bazės Startup.ConfigureServices
kontekstą, įtraukite ją į :
// 追加 (自前のクラスなので名前空間は適時合わせてください)
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>
Metodo tipo argumentas nurodo sukurtą konteksto klasę.
options.UseSqlServer
Metodas nurodo, kad naudojamas SQL serveris.
Configuration.GetConnectionString("TestDatabaseDbContext")
nurodo rakto pavadinimą, užregistruotą appsettings.json.
ASP.NET naudojimo atvejis Core MVC
ASP.NET yra keletas būdų, kaip naudoti subjekto sistemos branduolį pagrindinėje MVC.
Di (priklausomybės įterpimo) įtraukimas į valdiklį
Registruojant .cs services.AddDbContext
metodą paleisties metu.cs TestDatabaseDbContext
Jis gali būti įterptas į valdiklį.
DI pavyzdys HomeController
yra tai, kad konstruktorius turi ILogger<HomeController> logger
argumentą.
Tai pridedama DI. Galite įterpti TestDatabaseDbContext
tokiu pačiu būdu.
Jei HomeController
norite įtraukti į esamą , atrodo taip: Žinoma, jis gali būti pridėtas prie kitų kontrolierių.
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; // 追加
}
// 省略
}
Tada galite pasiekti duomenų bazę naudodami kiekvieno veiksmo gauto konteksto egzempliorių.
Naudoti atvejus
Šis kodas yra kodas, kuris tvarko vartotojų sąrašą ir naujas registracijas. Nuo šiol ASP.NET branduolys, Subjekto pagrindų branduolys bus kodas kiekvienam, todėl aš ne išsamiai paaiškinti.
Objekto sistemos branduolio sugeneruotą modelį vis tiek galima naudoti kaip veiksmų modelį. Taip pat galite sukurti atskirą modelį ir vynioti bei naudoti objekto sistemos pagrindinį modelį.
Be to, kontekstas automatiškai atmetamas, kai vartotojo užklausa baigėsi.
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));
}
// ここまで追加
// 省略
}
Kadangi sunku sukurti ekraną rankiniu būdu, sąrašo ekranas automatiškai generuojamas pastoliais.
Views/Home/List.cshtml
Automatiškai sugeneruotas yra toks:
@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
Įtraukite saitą į ekrano perėjimą į sąrašą.
<!-- 省略 -->
<ul>
<li><a asp-action="List">List</a></li>
</ul>
Vartotojo registracijos ekranas taip pat generuojamas automatiškai.
Views/Home/Create.cshtml
Automatiškai sugeneruotas yra toks:
Sunku naudoti taip, kaip yra, todėl šiek tiek jį ištaisiau.
@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");}
}
Paleiskite ir patvirtinkite. Beje, nėra jokių saugumo priemonių, tokių kaip slaptažodžio registracija, todėl dirbdami vadovaukitės ASP.NET Core" ir duomenų bazės registracijos metodais.
Žinoma, tai atsispindi duomenų bazėje.
Šie patarimai nesukuria redagavimų ar naikinimų, todėl galite naudoti redagavimą tinkamu | Išsami informacija | Naikinti" taip pat sukelia klaidą. Galite jį sukurti taip pat, kaip kurti, todėl išbandykite. Pirmiau minėti trys procesai taip pat buvo įtraukti į kodo pavyzdį.
Gauti duomenų bazės kontekstą iš RequestServices
Di pridėjimas prie valdiklio konstruktoriaus gali būti šiek tiek sudėtingas, nes turite jį pridėti prie visų reikiamų valdiklių.
Arba RequestServices
galite gauti iš .
Jis nėra įtrauktas į imties kodą, tačiau jį galima gauti taip.
<summary>
ユーザー一覧表示アクション。
</summary>
public IActionResult List()
{
// RequestServices からデータベースコンテキストを取得する
var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
// データベースから User 一覧を取得する
var users = dbContext.Users.ToList();
// ビューに渡す
return View(users);
}
Duomenų bazės konteksto kūrimas tiesiogiai
Jis taip pat naudojamas konsolėse ir darbalaukio programose. Šį metodą galite naudoti be jokių problemų. Tai nerekomenduojama, nes operacijų apimtis paprastai yra dviprasmiška žiniatinklio programose, kuriose gali atsirasti vienalaikė prieiga. Visų pirma, naujinimų gali nepavykti grąžinti į atskirą užklausą.
Jei prie duomenų bazės prisijungsite tokiu būdu, DbContext
naudosite techniką, kad gautumėte .
Pirmiausia Startup
modifikuokite darbą su 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
Sukurkite klasę, TestDatabaseDbContextEx
gautą iš appsettings.json jungimosi eilutės, ir nustatykite ją.
Jei galite nustatyti jungimosi eilutę, galite taikyti kitą metodą, pvz., perduoti ją per konstruktorių.
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"));
}
}
}
}
Jei norite pasiekti duomenų bazę, sugeneruokite ir naudokite išvestinių klasių egzempliorius.
<summary>
ユーザー一覧表示アクション。
</summary>
public IActionResult List()
{
// 派生クラスのデータベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContextEx();
// データベースから User 一覧を取得する
var users = dbContext.Users.ToList();
// ビューに渡す
return View(users);
}
ASP.NET pavyzdys "Core Razor" puslapyje
ASP.NET keliais būdais, kaip naudoti "Entity Framework Core" pagrindiniame skustuvo puslapyje.
Di (priklausomybės įterpimo) įtraukimas į puslapio modelį
Registruojant .cs services.AddDbContext
metodą paleisties metu.cs TestDatabaseDbContext
Jį galima įterpti į puslapio modelį.
DI pavyzdys IndexModel
yra tai, kad konstruktorius turi ILogger<IndexModel> logger
argumentą.
Tai pridedama DI. Galite įterpti TestDatabaseDbContext
tokiu pačiu būdu.
Jei IndexModel
norite įtraukti į esamą , atrodo taip: Žinoma, jis gali būti pridėtas prie kitų puslapių modelių.
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; // 追加
}
// 省略
}
Tada galite pasiekti duomenų bazę naudodami konteksto, kurį gavote kiekviename procese, egzempliorių.
Naudoti atvejus
Šis kodas yra kodas, kuris tvarko vartotojų sąrašą ir naujas registracijas. Tiek "ASP.NET Core", tiek "Entity Framework Core" bus kodas, todėl nesileisiu į detales. Be to, kontekstas automatiškai atmetamas, kai vartotojo užklausa baigėsi.
Sukurkite sąrašo ekrano puslapio modelį.
List.cshtml.cs taip:
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 sukurtas taip:
@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>
Įtraukite jį į Index.cshtml, kad galėtumėte pereiti į sąrašo puslapį.
<!-- 追加 -->
<ul>
<li><a asp-page="List">List</a></li>
</ul>
Taip pat sukurkite vartotojo registracijos ekraną.
Create.cshtml.cs kodas toks:
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 taip:
@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>
Paleiskite ir patvirtinkite. Beje, nėra jokių saugumo priemonių, tokių kaip slaptažodžio registracija, todėl dirbdami vadovaukitės ASP.NET Core" ir duomenų bazės registracijos metodais.
Žinoma, tai atsispindi duomenų bazėje.
Nesukūrė jokių redagavimų ar naikinimų, todėl nenoriu redaguoti, kad | Išsami informacija | Naikinti" taip pat sukelia klaidą. Galite jį sukurti taip pat, kaip kurti, todėl išbandykite. Pirmiau minėti trys procesai taip pat buvo įtraukti į kodo pavyzdį.
Gauti duomenų bazės kontekstą iš RequestServices
Pridėti di prie puslapio modelio konstruktorius yra šiek tiek sudėtinga, nes jūs turite įtraukti jį į visus puslapio modelius, jums reikia.
Arba RequestServices
galite gauti iš .
Jis nėra įtrauktas į imties kodą, tačiau jį galima gauti taip.
<summary>
ページにアクセスされたときに呼ばれます。
</summary>
public void OnGet()
{
// RequestServices からデータベースコンテキストを取得する
var dbContext = (TestDatabaseDbContext)HttpContext.RequestServices.GetService(typeof(TestDatabaseDbContext));
// データベースからユーザー一覧を取得します。
Users = dbContext.Users.ToList();
}
Duomenų bazės konteksto kūrimas tiesiogiai
Jis taip pat naudojamas konsolėse ir darbalaukio programose. Šį metodą galite naudoti be jokių problemų. Tai nerekomenduojama, nes operacijų apimtis paprastai yra dviprasmiška žiniatinklio programose, kuriose gali atsirasti vienalaikė prieiga. Visų pirma, naujinimų gali nepavykti grąžinti į atskirą užklausą.
Jei prie duomenų bazės prisijungsite tokiu būdu, DbContext
naudosite techniką, kad gautumėte .
Pirmiausia Startup
modifikuokite darbą su 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
Sukurkite klasę, TestDatabaseDbContextEx
gautą iš appsettings.json jungimosi eilutės, ir nustatykite ją.
Jei galite nustatyti jungimosi eilutę, galite taikyti kitą metodą, pvz., perduoti ją per konstruktorių.
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"));
}
}
}
}
Jei norite pasiekti duomenų bazę, sugeneruokite ir naudokite išvestinių klasių egzempliorius.
<summary>
ページにアクセスされたときに呼ばれます。
</summary>
public void OnGet()
{
// 派生クラスのデータベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContextEx();
// データベースからユーザー一覧を取得します。
Users = dbContext.Users.ToList();
}