Çekirdekte Varlık Çerçevesi Çekirdeği'ne kullanarak veritabanlarına ASP.NET

Sayfa oluşturma tarihi :

Ortam

Visual Studio
  • Visual Studio 2019
ASP.NET Çekirdek
  • 3.1 (MVC, Razor sayfası)
SQL Server
  • 2019 Ekspres

İlk başta

Bu ipuçları, Aşağıdaki Çekirdek yaklaşımını kullanarak Varlık Çerçevesi Çekirdeği'ni kullanma adımlarını ASP.NET.

Veritabanı oluşturmak, Varlık Çerçevesi Çekirdeği'ni kullanmak vb. Core ASP.NET un dışında da aynı şekilde kullanılıyorlar.

Bu kez, SQL Server farklı bir sunucuya yüklenir ve SQL Server kimlik doğrulaması ile bağlanır. Yerel yükleme sırasında kullanılan Windows kimlik doğrulamasından tek fark bağlantı dizesidir ve programda hiçbir fark yoktur.

Veritabanı tablosu oluşturma

Bu İpuçları SQL Server kullanır. SQL Server'ı yerel ortamınıza veya herhangi bir sunucuya yükleyin.

Sınama için bir veritabanınız yoksa, bir veritabanı oluşturun.

Aşağıdakiler gibi SQL'de oluşturuyorsanız, SQL Server sürüm yolunu ve veritabanı adını ortamınıza uyacak şekilde değiştirin.

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

Test için bir tablo oluşturun. Güncelleştirmeler ve silmeler için birincil anahtarı ayarlayın.

SQL'de oluşturmak istiyorsanız:

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

Görüntü için bir kayıt ekleyin.

SQL'de eklemek istiyorsanız:

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

Core ASP.NET da kullanılabilen varlık çerçevesi

Bu öğe hem MVC hem de Razor sayfalarında ortaktır.

Varlık Çerçevesi Çekirdeği'nin paket yüklemesi

Projenizi oluşturduktan sonra, önce Varlık Çerçevesi Çekirdeği'ni kullanabilmeniz için paketi NuGet'ten alın. MVC bir örnektir, ancak işlem jilet sayfalarında aynıdır.

Projeden Bağımlılıklar'ı sağ tıklatın ve NuGet paketlerini yönet'i seçin.

Sekmeden Gözat seçiliyken, arama alanına EntityFrameworkCore yazın. Varlık Çerçevesi Çekirdek ile ilgili paketler listede görünür.

Bu süreden itibaren SQL Server kullanacağım, bu nedenle aşağıdaki paketleri yükleyeceğim.

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

Örnek olarak Microsoft.EntityFrameworkCore'u yükleyelim, bu nedenle diğer ikisini de yükleyin.

Yüklemek istediklerinizi seçin ve yükle düğmesini tıklatın. Sürüm en son sabitleyiciyi seçer.

İletişim kutusu temelde Tamam'ı tıklatmak için tamamdır.

Diğer ikisini de takın.

Paketin aşağıdaki gibi olduğunu düşünüyorum.

Veritabanı tablosu yapılandırmasından model (program) oluşturma

Entity Framework Core'daki bir veritabanından veri almak veya güncelleştirmek istiyorsanız, Genellikle tablo yapılandırmasını temel alan bir model olan bir program oluşturmanız gerekir. Bu modele diğer ad varlığı da denir.

Bir model, önce kod oluşturduğunuzda, bir modelden (programdan) veritabanında tablo oluşturma tekniği veya Önce, tablolardan modeller (programlar) oluşturmak için bir teknik olan veritabanı vardır. İşte bir tablodan otomatik olarak programlamanın basit bir veritabanı ilk yolu.

Bu arada, bu adımlar Çekirdek'e ASP.NET, böylece bunları konsol veya masaüstü uygulamasında aynı şekilde oluşturabilirsiniz.

İlk olarak, hata olmadığından emin olmak için projeyi bir kez oluşturun. Bir hata varsa, model oluşturulamaz. Hata olmadığını zaten doğruladıysanız, bunu yapmanız gerekmez.

Visual Studio'dan Paket Yöneticisi konsolını açın. Aksi takdirde, menüdeki araçlardan, NuGet Paket Yöneticisi'nden ve Paket Yöneticisi konsollarından açabilirsiniz.

Aşağıdakine benzer bir pencere görürsünüz, bu nedenle sağ üstteki Varsayılan Projenin modellemek istediğiniz proje olduğundan emin olun. (Birden fazla projeniz varsa dikkatli olmanız gerekir)

Giriş alanına aşağıdaki metni yazın: Parametreler ortama bağlı olarak değişir, bu nedenle lütfen bunları aşağıdaki açıklamaya zamanında değiştirin. (özellikle *** olduğu yerde)

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

Her adın başındaki gibi tireli -Provider olan parametre adıdır ve ardından bu parametrenin değeridir.

Parametre Açıklaması Parametre Örneği
Sağlayıcı SQL Microsoft.EntityFrameworkCore.SqlServer Server'da düzeltildi. Microsoft.EntityFrameworkCore.SqlServer
Bağlantı Veritabanına bağlanmak için bağlantı dizesi. Bağlantı dizeleri diğer ortak uygulamalarda kullanılabilir, bu nedenle lütfen kineki bağlantı dizesine göre belirttiğinizi yazın. Hem Windows kimlik doğrulaması hem de SQL Server kimlik doğrulaması kullanılabilir. Bu arada, yalnızca geçici olarak bir model oluşturmak için kullanılır, bu nedenle uygulama bu bağlantı dizesi için yayınlandıktan sonra güvenliğin farkında olmanız gerekmez. Şifrenizde bir sembol varsa kaçmaya dikkat edin. "Veri Kaynağı=SunucuAdı\SQLEXPRESS;Veritabanı=TestDatabase;kullanıcı kimliği=KullanıcıAdı;password=***********"
F Zaten bir program olsa bile üzerine yazmayı zorla. <Hayır >
OutputDir Kodun çıktı olduğu klasör yolu. Proje klasöründen göreli yol Modeller\Veritabanı
Bağlam Varlık Çerçevesi kullanılırken bağlam sınıfı adı TestDatabaseDbContext
UseDatabaseNames Belirtilirse, veritabanının tablo adı olduğu gibi sınıf adı olur. Aksi takdirde, büyük/küçük harf ve varlık sınıfı adının birden çok formu kurallara göre ayarlanır. <Hayır >
DataAnnotations Belirtilirse, sütun türü dataannotation özniteliğini her özelliğe otomatik olarak ekler. Veritabanının türüne göre girişi otomatik olarak denetlemek istiyorsanız, bu biraz yararlıdır. <Hayır >

Çalıştırmak için Enter tuşuna basıldığında otomatik olarak aşağıdaki gibi kod oluşturulur:

Kullanıcı tablosunun model kodu aşağıdaki gibidir:

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

Bu arada, bağlantı dizesi oluşturulan bağlam sınıfının kodunda olduğu gibi listelendiğinden uyarı görüntülenir. OnConfiguring Kod oluşturulduktan sonra bu bağlam sınıfındaki yöntemleri silden emin olun.

Bağlantı dizelerini kaydetme

Bu, çekirdeğe özgü işlemeyi ASP.NET. (Özelleştirirseniz, diğer .NET Core uygulamalarında kullanabilirsiniz, ancak ASP.NET Core için varsayılan olarak işleyebilirsiniz.)

Paket Yöneticisi konsolunda belirtilen bağlantı dizesi yalnızca modeli oluşturmak için kullanıldı.

Veritabanına web uygulaması olarak bağlanmak için bağlantı dizesi appsettings.json'da listelenir. Her yapı veya yayın için bağlanacak veritabanı hedefini değiştirmek istiyorsanız, uygulama ısıtıcılarını kullanabilirsiniz. Ayrıca Development.json vb.

Buna ek olarak, buradaki bağlantı dizesi işlem olarak kullanıldığından, bağlantı kullanıcısını güvenlik vb.

Appsettings.json olarak ayarlarsanız, kök bölümünde bir ConnectionStrings bölümü oluşturun (tam olarak bir bölüm değil, bir nesne). içinde bir anahtar ve değer kümesi oluşturun. Anahtarın adı herhangi bir şey olabilir, ancak daha sonra kullanılacaktır. Değer bir bağlantı dizesi belirtir.

{
  // 

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

Varlık Çerçevesi Çekirdeğini programlar için kullanılabilir hale getirme

Bu, çekirdeğe özgü işlemeyi ASP.NET. (Özelleştirirseniz, diğer .NET Core uygulamalarında kullanabilirsiniz, ancak ASP.NET Core için varsayılan olarak işleyebilirsiniz.)

Core ASP.NET, her bulut sunucusunun konsollardan ve masaüstü uygulamalarından farklı bir hayatta kalma süresi vardır. Örneğin, "Web hizmetinin başlatıldığı andan durdurulana kadar" veya "isteğin alındığı andan yanıt döndürülene kadar". çekirdek içine yerleştirilebilen ASP.NET framework Core ServiceLifetime.Scoped varsayılan olarak belirtir. Özel bir neden yoksa, bu şekilde kalabilirsiniz.

Programınızın veritabanı bağlamı içeriğine erişmesine izin vermek Startup.ConfigureServices için, aşağıdakilere ekleyin:

// 追加 (自前のクラスなので名前空間は適時合わせてください)
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> Yöntemin tür bağımsız değişkeni, oluşturduğunuz bağlam sınıfını belirtir.

options.UseSqlServer Yöntem, SQL Server'ın kullanıldığını gösterir.

Configuration.GetConnectionString("TestDatabaseDbContext") appsettings.json ile kayıtlı anahtar adını belirtir.

Core MVC'de ASP.NET kullanım örneği

ASP.NET, Çekirdek MVC'de Varlık Çerçevesi Çekirdeği'yi kullanmanın birkaç yoludur.

Denetleyiciye di (bağımlılık ekleme) ekleme

Başlangıçta .cs yöntemi services.AddDbContext kaydederek.cs TestDatabaseDbContext Denetleyiciye takılabilir.

DI HomeController örneği, oluşturucunun bir ILogger<HomeController> logger bağımsız değişkeni olmasıdır. Bu DI tarafından eklenir. TestDatabaseDbContext Aynı şekilde ekleyebilirsiniz.

Varolan HomeController bir öğeye eklemek istiyorsanız, şöyle görünür: Tabii ki, diğer kontrolörlere eklenebilir.

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

Daha sonra her eylemde alınan bağlamın örneğini kullanarak veritabanına erişebilirsiniz.

Kullanım örnekleri

Aşağıdaki kod, kullanıcı listesini ve yeni kayıtları işleyen koddur. Şu andan itibaren ASP.NET çekirdekte, Varlık Çerçevesi Çekirdeği her biri için kod olacak, bu yüzden ayrıntılı olarak açıklamam.

Varlık Framework Core tarafından oluşturulan model eylemler için bir model olarak kullanılabilir. Ayrıca ayrı bir model oluşturabilir ve Varlık Çerçevesi Çekirdek modelini kaydırabilir ve kullanabilirsiniz.

Ayrıca, kullanıcının isteği sona erdiğinde içerik otomatik olarak atılır.

Ev Kontrol.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));
  }

  // ここまで追加

  // 省略
}

Ekranı manuel olarak oluşturmak zahmetli olduğundan, liste ekranı otomatik olarak iskele tarafından oluşturulur.

Views/Home/List.cshtmlOtomatik oluşturulan aşağıdaki gibidir:

@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 Listeye ekran geçişine bir bağlantı ekleyin.

<!-- 省略 -->

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

Kullanıcı kayıt ekranı da otomatik olarak oluşturulur.

Views/Home/Create.cshtmlOtomatik oluşturulan aşağıdaki gibidir: Olduğu gibi kullanmak zor, bu yüzden biraz düzelttim.

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

Koşun ve onaylayın. Bu arada, şifre kaydı gibi herhangi bir güvenlik önlemi yoktur, bu nedenle lütfen çalışırken ASP.NET Core ve veritabanı kayıt yöntemlerini izleyin.

Tabii ki, veritabanına yansır.

Bu İpuçları düzenleme veya silme oluşturmaz, bu nedenle düzenlemeyi sağdaki | Ayrıntılar | Sil" de bir hataya neden olur. Oluştur ile aynı şekilde oluşturabilirsiniz, bu yüzden deneyin. Yukarıdaki üç işlem de örnek koda eklenmiştir.

RequestServices'ten veritabanı bağlamı alma

Bir denetleyici oluşturucusunda di eklemek biraz hantal olabilir, çünkü ihtiyacınız olan tüm denetleyicilere eklemeniz gerekir. Alternatif olarak, RequestServices 'den alabilirsiniz.

Örnek koda dahil değildir, ancak aşağıdaki gibi elde edilebilir.

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

Doğrudan veritabanı bağlamı oluşturma

Konsollarda ve masaüstü uygulamalarında da kullanılır. Bu yöntemi sorunsuz bir şekilde kullanabilirsiniz. Hareketlerin kapsamı, eşzamanlı erişimin gerçekleşmesinin muhtemel olduğu Web uygulamalarında belirsiz olma eğiliminde olduğundan önerilmez. Özellikle, güncelleştirmeler istek üzerine geri alınamayabilir.

Veritabanına bu şekilde DbContext eriştiyseniz, türetmek için bir teknik kullanırsınız.

İlk olarak, Startup ile çalışmak için Configuration static değiştirin.

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

  // 省略
}

TestDatabaseDbContextTestDatabaseDbContextExAppsettings.json bağlantı dizesinden türetilmiş bir sınıf oluşturun ve ayarlayın. Bir bağlantı dizesi ayarlayabilirseniz, bir oluşturucudan geçirmek gibi başka bir yöntem alabilirsiniz.

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

Veritabanına erişmek istiyorsanız, türetilmiş sınıfların örneklerini oluşturun ve kullanın.

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

Core Razor sayfasında ASP.NET örneği

Core Razor sayfasında Entity Framework Core kullanmanın çeşitli yollarını ASP.NET.

Sayfa modeline di (bağımlılık ekleme) ekleme

Başlangıçta .cs yöntemi services.AddDbContext kaydederek.cs TestDatabaseDbContext Sayfa modeline eklenebilir.

DI IndexModel örneği, oluşturucunun bir ILogger<IndexModel> logger bağımsız değişkeni olmasıdır. Bu DI tarafından eklenir. TestDatabaseDbContext Aynı şekilde ekleyebilirsiniz.

Varolan IndexModel bir öğeye eklemek istiyorsanız, şöyle görünür: Tabii ki, diğer sayfa modellerine eklenebilir.

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

Daha sonra her işlemde aldığınız bağlamın örneğini kullanarak veritabanına erişebilirsiniz.

Kullanım örnekleri

Aşağıdaki kod, kullanıcı listesini ve yeni kayıtları işleyen koddur. Hem ASP.NET Core hem de Entity Framework Core kod olacak, bu yüzden ayrıntılara girmeyeceğim. Ayrıca, kullanıcının isteği sona erdiğinde içerik otomatik olarak atılır.

Liste ekranı için bir sayfa modeli oluşturun.

List.cshtml.cs aşağıdaki gibi:

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 aşağıdaki gibi oluşturulur:

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

Liste sayfasına geçiş yapabilmeniz için Index.cshtml sayfasına ekleyin.

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

Kullanıcı kayıt ekranı da oluşturun.

Create.cshtml.cs kodu aşağıdaki gibi:

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 aşağıdaki gibi:

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

Koşun ve onaylayın. Bu arada, şifre kaydı gibi herhangi bir güvenlik önlemi yoktur, bu nedenle lütfen çalışırken ASP.NET Core ve veritabanı kayıt yöntemlerini izleyin.

Tabii ki, veritabanına yansır.

Herhangi bir düzenleme veya silme oluşturmadım, bu nedenle düzenlemenin | Ayrıntılar | Sil" de bir hataya neden olur. Oluştur ile aynı şekilde oluşturabilirsiniz, bu yüzden deneyin. Yukarıdaki üç işlem de örnek koda eklenmiştir.

RequestServices'ten veritabanı bağlamı alma

Di sayfa modeli oluşturucusunun eklenmesi biraz hantaldır, çünkü bunu ihtiyacınız olan tüm sayfa modellerine eklemeniz gerekir. Alternatif olarak, RequestServices 'den alabilirsiniz.

Örnek koda dahil değildir, ancak aşağıdaki gibi elde edilebilir.

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

Doğrudan veritabanı bağlamı oluşturma

Konsollarda ve masaüstü uygulamalarında da kullanılır. Bu yöntemi sorunsuz bir şekilde kullanabilirsiniz. Hareketlerin kapsamı, eşzamanlı erişimin gerçekleşmesinin muhtemel olduğu Web uygulamalarında belirsiz olma eğiliminde olduğundan önerilmez. Özellikle, güncelleştirmeler istek üzerine geri alınamayabilir.

Veritabanına bu şekilde DbContext eriştiyseniz, türetmek için bir teknik kullanırsınız.

İlk olarak, Startup ile çalışmak için Configuration static değiştirin.

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

  // 省略
}

TestDatabaseDbContextTestDatabaseDbContextExAppsettings.json bağlantı dizesinden türetilmiş bir sınıf oluşturun ve ayarlayın. Bir bağlantı dizesi ayarlayabilirseniz, bir oluşturucudan geçirmek gibi başka bir yöntem alabilirsiniz.

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

Veritabanına erişmek istiyorsanız, türetilmiş sınıfların örneklerini oluşturun ve kullanın.

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