ASP.NET бази данни чрез ядро на рамка на обект в ядро

Дата на създаване на страница :

Околната среда

Визуално студио
  • Изглед от 10 до 2008
ASP.NET ядро
  • 3.1 (ТВК, страницата на самобръснача)
SQL сървър
  • Експрес 2019

На първо време

Тези съвети ASP.NET стъпки за използване на ядрото на рамка на обектите, като използвате подхода Следване на ядрото.

Създаването на база данни, използвайки Ядро на рамка на обект, и т.н. не са основният фокус на тези съвети, така че няма да навлизаме в подробности. Те ASP.NET използвани по същия начин извън Ядро.

Този път SQL сървърът е инсталиран на друг сървър и е свързан с удостоверяване на SQL Server. Единствената разлика от удостоверяването на Windows, използвано по време на локална инсталация, е низът за връзка и няма разлика в програмата.

Създаване на таблица в база данни

Този съвет използва SQL Server. Инсталирайте SQL Server във вашата локална среда или на всеки сървър.

Ако нямате база данни за тестване, създайте база данни.

Ако създавате в SQL, като например по-долу, променете SQL Server версия път и име на база данни да отговарят на вашата среда.

USE [master]
GO

CREATE DATABASE [TestDatabase]
  CONTAINMENT = NONE
  ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
  LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
  WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO

Създайте таблица за тестване. Задайте първичния ключ за актуализации и изтривания.

Ако искате да го създадете в SQL:

USE [TestDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[User](
  [ID] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL,
  [Password] [nvarchar](20) NOT NULL,
  [Age] [int] NULL,
  [Email] [nvarchar](200) NULL,
  [Birthday] [date] NULL,
  [UpdateDateTime] [datetime2](7) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
  [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

Добавяне на запис за показване.

Ако искате да го добавите в SQL:

USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO

ASP.NET рамка на субекта, налична в

Този елемент е често срещан за MVC и Razor страници.

Пакетна инсталация на основен обект рамка

След като създадете вашия проект, получете пакета от NuGet, за да можете първо да използвате ядрото на рамка на обект. MVC е пример, но операцията е същата на бръснач страници.

С десния бутон върху зависимости от проекта и изберете Управление на NuGet пакети.

С преглед, избран от раздела, въведете EntityFrameworkCore в полето за търсене. Основните пакети на рамка на обект се появяват в списъка.

От този момент ще използвам SQL Server, така че ще инсталирам следните пакети.

  • Прегледайте оригиналната статия на английски: 300119
  • Инструменти за Microsoft.EntityWork.:
  • Преглед на оригиналната статия на английски: 3111111

Нека да инсталираме Microsoft.EntityFrameworkCore като пример, така че инсталирайте и другите две.

Изберете това, което искате да инсталирате, след което щракнете върху бутона за инсталиране. Версията избира най-новия стабилизатор.

Диалоговият прозорец е основно ОК, за да кликнете ok.

Монтирайте и другите две.

Мисля, че пакетът е както следва.

Създаване на модел (програма) от конфигурация на таблица на база данни

Ако искате да извлечете или актуализирате данни от база данни в ядрото на рамка на обект, Обикновено трябва да създадете програма, която е модел, базиран на конфигурацията на таблицата. Този модел се нарича също обект псевдоним.

Когато създавате модел, първо код, техника за създаване на таблици в база данни от модел (програма) или Има база данни на първо място, което е техника за създаване на модели (програми) от таблици. Ето един прост начин за автоматично програмиране от таблицата.

Между другото, тези стъпки са ASP.NET към The 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 Server. Преглед на оригиналната статия на английски: 3111111
Връзка Низ за свързване за свързване с базата данни. Низовете за връзка могат да се използват в други общи приложения, така че моля, напишете това, което сте посочили според низ връзка kineki. Както удостоверяването на Windows, така и удостоверяването на SQL Server са налични. Между другото, той се използва само временно за създаване на модел, така че не е нужно да сте наясно със сигурността, след като приложението е публикувано за този низ за връзка. Внимавайте да избягате, ако имате символ в паролата си. "Източник на данни=Име_на_сървър\SQLEXPRESS;База данни=Тестдан база данни;потребителско име;парола=**********"
F Принудително презаписване дори ако вече има програма. <Не >
Изходна директория Пътят на папката, до който е изходен код. Относителен път от папката на проекта Модели\База данни
Контекста Контекстно име на клас при използване на рамка за обекти Контекст на данни за тестване
Използване на имена на бази данни Ако е указано, името на таблицата на базата данни става името на класа, както е. В противен случай и множествената форма на името на класа на обекта се коригират според правилата. <Не >
ДанниАнотации Ако е зададено, типът на колоната автоматично добавя атрибута DataAnnotation към всяко свойство. Това е малко полезно, ако искате автоматично да проверите входа според типа на базата данни. <Не >

Натискането на Enter за да стартирате тя автоматично ще генерира код, както следва:

Кодът на модела за таблицата Потребител е както следва:

[Table("User")]
public partial class User
{
  [Key]
  public int ID { get; set; }
  [Required]
  [StringLength(20)]
  public string Name { get; set; }
  [Required]
  [StringLength(20)]
  public string Password { get; set; }
  public int? Age { get; set; }
  [StringLength(200)]
  public string Email { get; set; }
  [Column(TypeName = "date")]
  public DateTime? Birthday { get; set; }
  public DateTime? UpdateDateTime { get; set; }
}

Между другото предупреждението се показва, защото низът на връзката е посочен в кода на генерира контекст клас. Не забравяйте да изтриете OnConfiguring методите в този контекст клас след генериране на кода.

Регистриране на низове на връзка

Тази ASP.NET основна обработка. (Ако го персонализирате, можете да го използвате в други приложения на .NET Core, но ASP.NET можете да се справите по подразбиране за Core.)

Низът на връзката, зададен в конзолата на Диспечера на пакети, се използва само за генериране на модела.

Низът за свързване към базата данни като уеб приложение е в appsettings.json. Ако искате да промените местоназначението на базата данни, за да се свържете за всяка компилация или публикация, можете да използвате приложения. Тя може да бъде разклонена от Development.json и др.

В допълнение, тъй като низът за връзка тук се използва като операция, нека вземем мерки като например да направим потребителя връзка специален потребител в предвид сигурността и т.н.

Ако зададете appsettings.json, създайте секцияТа ConnectionStrings в раздела за корен (обект, не точно раздел). Създайте набор от ключове и стойности в него. Името на ключа може да бъде всичко, но ще се използва по-късно. Стойността задава низ за връзка.

{
  // 

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

Направи ядрото на обект на разположение на програмите

Тази ASP.NET основна обработка. (Ако го персонализирате, можете да го използвате в други приложения на .NET Core, но ASP.NET можете да се справите по подразбиране за Core.)

ASP.NET Core, всеки екземпляр има време на оцеляване, което е различно от конзолите и настолните приложения. Например "От момента, когато уеб услугата се стартира, докато не бъде спряна" или "от момента, когато заявката е получена до отговорът се връща". ASP.NET рамка Core, която може да бъде поставена в The Core, ServiceLifetime.Scoped по подразбиране се указва. Ако няма специална причина, можете да останете по този начин.

За да разрешите на вашата програма достъп до контекста на базата данни, Startup.ConfigureServices добавете я към :

// 追加 (自前のクラスなので名前空間は適時合わせてください)
using DatabaseEntityFrameworkCoreMvc.Models.Database;

// 追加
using Microsoft.EntityFrameworkCore;

public class Startup
{
  // 省略

  // このメソッドはランタイムによって呼び出されます。 このメソッドを使用して、コンテナーにサービスを追加します。
  public void ConfigureServices(IServiceCollection services)
  {
    // 省略

    // 追加
    services.AddDbContext<TestDatabaseDbContext>(
      options => options.UseSqlServer(Configuration.GetConnectionString("TestDatabaseDbContext")));
  }

  // 省略

services.AddDbContext<TestDatabaseDbContext> Тип аргумент на метода задава контекстния клас, който сте създали.

options.UseSqlServer Методът показва, че се използва SQL сървър.

Configuration.GetConnectionString("TestDatabaseDbContext") име на ключ, регистрирано с appsettings.json.

ASP.NET употреба в ядрото MVC

ASP.NET са няколко начина да използвате ядрото на рамка на обект в ядрото MVC.

Добавяне на di (вмъкване на зависимост) към контролер

Чрез регистриране на services.AddDbContext .cs метод в стартирането.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 ядро, Entity Framework Core ще бъде код за всеки, така че няма да обяснявам подробно.

Основният генериран модел на рамка на обект все още може да се използва като модел за действия. Можете също да създадете отделен модел и обвиване и използване на ядрото на рамка на обект.

Също така контекстът се отхвърля автоматично, когато заявката на потребителя е приключила.

Управленец за дома.cs

public class HomeController : Controller
{
  private readonly TestDatabaseDbContext _dbContext;

  // 省略

  // ここから追加

  /// <summary>
  /// ユーザー一覧表示アクション。
  /// </summary>
  public IActionResult List()
  {
    // データベースから User 一覧を取得する
    var users = _dbContext.Users.ToList();
    
    // ビューに渡す
    return View(users);
  }
  
  /// <summary>
  /// ユーザー一新規登録画面。
  /// </summary>
  public IActionResult Create()
  {
    return View();
  }
  
  /// <summary>
  /// ユーザー新規登録処理。
  /// </summary>
  [HttpPost]
  public IActionResult Create(User user)
  {
    // エラーがある場合は登録画面に戻る
    if (ModelState.IsValid == false) View(user);
    
    // 更新日時設定
    user.UpdateDateTime = DateTime.Now;

    // 登録リストにユーザー追加
    _dbContext.Users.Add(user);

    // 登録を確定する
    _dbContext.SaveChanges();
    
    // 一覧画面に遷移
    return RedirectToAction(nameof(List));
  }

  // ここまで追加

  // 省略
}

Тъй като е обезпокоително да се създаде екрана ръчно, екранът със списък се генерира автоматично от скеле.

Views/Home/List.cshtmlАвтоматично генерираните е както следва:

@model IEnumerable<DatabaseEntityFrameworkCoreMvc.Models.Database.User>

@{
  ViewData["Title"] = "List";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>List</h1>

<p>
  <a asp-action="Create">Create New</a>
</p>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.ID)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Name)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Password)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Age)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Email)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.Birthday)
      </th>
      <th>
        @Html.DisplayNameFor(model => model.UpdateDateTime)
      </th>
      <th></th>
    </tr>
  </thead>
  <tbody>
@foreach (var item in Model) {
    <tr>
      <td>
        @Html.DisplayFor(modelItem => item.ID)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Name)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Password)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Age)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Email)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.Birthday)
      </td>
      <td>
        @Html.DisplayFor(modelItem => item.UpdateDateTime)
      </td>
      <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
      </td>
    </tr>
}
  </tbody>
</table>

Index.cshtml Добавяне на връзка към прехода към екрана към списъка.

<!-- 省略 -->

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

Екранът за регистрация на потребителя също се генерира автоматично.

Views/Home/Create.cshtmlАвтоматично генерираните е както следва: Трудно е да се използва така, както е, така че аз го оправих малко.

@model DatabaseEntityFrameworkCoreMvc.Models.Database.User

@{
  ViewData["Title"] = "Create";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="ID" class="control-label"></label>
        <input asp-for="ID" class="form-control" />
        <span asp-validation-for="ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Name" class="control-label"></label>
        <input asp-for="Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Password" class="control-label"></label>
        <input asp-for="Password" class="form-control" type="password" /> <!-- type="password" 追加 -->
        <span asp-validation-for="Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Age" class="control-label"></label>
        <input asp-for="Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Email" class="control-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="Birthday" class="control-label"></label>
        <input asp-for="Birthday" class="form-control" type="date" /> <!-- type="date" 追加 -->
        <span asp-validation-for="Birthday" class="text-danger"></span>
      </div>
      @* 更新日時は入力しないのでコメントアウト *@
      @*
      <div class="form-group">
        <label asp-for="UpdateDateTime" class="control-label"></label>
        <input asp-for="UpdateDateTime" class="form-control "/>
        <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
      </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
    <a asp-action="List">Back to List</a>  <!-- List に遷移するように変更 -->
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Бягай и потвърди. Между другото, няма мерки за сигурност, като например регистрация с парола, така че моля следвайте методите за регистриране на ASP.NET Core и база данни, когато работите.

Разбира се, тя се отразява в базата данни.

Тези съвети не създават редакции или изтривания, така че можете да използвате редактиране надясно | Подробности | Изтриване"причинява грешка. Можете да го създадете по същия начин като Създаване, така че опитайте. Горните три процеса също са добавени към примерния код.

Получете контекст на база данни от RequestServices

Добавянето di към контролер конструктор може да бъде малко тромаво, защото трябва да го добавите към всички контролери, от които се нуждаете. Като алтернатива можете RequestServices да получите от .

Той не е включен в примерния код, но може да бъде получена по следния начин.

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

Създаване на контекст на база данни директно

Той се използва и в конзоли и настолни приложения. Можете да използвате този метод без никакви проблеми. Не се препоръчва, защото обхватът на транзакциите е по-скоро двусмислени в уеб приложения, където има вероятност да се получи едновременен достъп. По-специално, актуализациите може да не могат да бъдат върнати обратно на базата на искане по заявка.

Ако получите достъп до базата данни по този начин, DbContext ще използвате техника за извличане на .

Първо, Startup променете да работите с Configuration static .

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

  // 省略
}

TestDatabaseDbContext Създайте TestDatabaseDbContextEx клас, получен от и задайте низа appsettings.json връзка. Ако можете да зададете низ за свързване, можете да използвате друг метод, като например да го преминете през конструктор.

using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace DatabaseEntityFrameworkCoreMvc.Models.Database
{
  public partial class TestDatabaseDbContextEx : TestDatabaseDbContext
  {
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      if (!optionsBuilder.IsConfigured)
      {
        optionsBuilder.UseSqlServer(Startup.ConfigurationStatic.GetConnectionString("TestDatabaseDbContext"));
      }
    }
  }
}

Ако искате да получите достъп до базата данни, генерирайте и използвайте екземпляри на производните класове.

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

ASP.NET пример на основна страница за самобръсначка

ASP.NET няколко начина да използвате ядрото на обект рамка на ядрото на Razor страница.

Добавяне на di (вмъкване на зависимост) към модела на страница

Чрез регистриране на services.AddDbContext .cs метод в стартирането.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 Ядро и обект рамка Core ще бъдат код, така че няма да навлизам в подробности. Също така контекстът се отхвърля автоматично, когато заявката на потребителя е приключила.

Създайте модел на страница за екрана със списъка.

Списък.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>

Създайте екран за регистрация на потребителя.

Създаване.cshtml.cs код както следва:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DatabaseEntityFrameworkCoreRazor.Models.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace DatabaseEntityFrameworkCoreRazor.Pages
{
  public class CreateModel : PageModel
  {
    private readonly TestDatabaseDbContext _dbContext;

    /// <summary>
    /// 登録するユーザー情報を格納します。
    /// </summary>
    [BindProperty]
    public User UserInfo { get; set; }

    /// <summary>
    /// DI で TestDatabaseDbContext を受け取ります。
    /// </summary>
    /// <param name="dbContext"></param>
    public CreateModel(TestDatabaseDbContext dbContext)
    {
      _dbContext = dbContext;
    }

    /// <summary>
    /// ページにアクセスされたときに呼ばれます。
    /// </summary>
    public void OnGet()
    {
      // 画面表示時は何もしません。
    }

    /// <summary>
    /// POST が送信されたときに呼ばれる。
    /// </summary>
    public IActionResult OnPost()
    {
      // エラーがある場合は登録画面に戻る
      if (ModelState.IsValid == false) return Page();

      // 更新日時設定
      UserInfo.UpdateDateTime = DateTime.Now;

      // 登録リストにユーザー追加
      _dbContext.Users.Add(UserInfo);

      // 登録を確定する
      _dbContext.SaveChanges();

      // 一覧画面に遷移
      return RedirectToPage("List");
    }
  }
}

Create.cshtml както следва:

@page
@model DatabaseEntityFrameworkCoreRazor.Pages.CreateModel
@{
}

<h1>Create</h1>

<h4>User</h4>
<hr />
<div class="row">
  <div class="col-md-4">
    <form asp-action="Create">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <div class="form-group">
        <label asp-for="UserInfo.ID" class="control-label"></label>
        <input asp-for="UserInfo.ID" class="form-control" />
        <span asp-validation-for="UserInfo.ID" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Name" class="control-label"></label>
        <input asp-for="UserInfo.Name" class="form-control" />
        <span asp-validation-for="UserInfo.Name" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Password" class="control-label"></label>
        <input asp-for="UserInfo.Password" class="form-control" type="password" />
        <span asp-validation-for="UserInfo.Password" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Age" class="control-label"></label>
        <input asp-for="UserInfo.Age" class="form-control" />
        <span asp-validation-for="UserInfo.Age" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Email" class="control-label"></label>
        <input asp-for="UserInfo.Email" class="form-control" />
        <span asp-validation-for="UserInfo.Email" class="text-danger"></span>
      </div>
      <div class="form-group">
        <label asp-for="UserInfo.Birthday" class="control-label"></label>
        <input asp-for="UserInfo.Birthday" class="form-control" type="date" />
        <span asp-validation-for="UserInfo.Birthday" class="text-danger"></span>
      </div>
      @*
        <div class="form-group">
          <label asp-for="UpdateDateTime" class="control-label"></label>
          <input asp-for="UpdateDateTime" class="form-control" />
          <span asp-validation-for="UpdateDateTime" class="text-danger"></span>
        </div>
      *@
      <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
      </div>
    </form>
  </div>
</div>

<div>
  <a asp-page="List">Back to List</a>
</div>

Бягай и потвърди. Между другото, няма мерки за сигурност, като например регистрация с парола, така че моля следвайте методите за регистриране на ASP.NET Core и база данни, когато работите.

Разбира се, тя се отразява в базата данни.

Не съм създал никакви редакции или изтривания, така че не искам редактирането да | Подробности | Изтриване"причинява грешка. Можете да го създадете по същия начин като Създаване, така че опитайте. Горните три процеса също са добавени към примерния код.

Получете контекст на база данни от RequestServices

Добавянето на ди към конструктор на модели на страници е малко тромаво, защото трябва да го добавите към всички модели страници, от които се нуждаете. Като алтернатива можете 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();
}