Çekirdekte Varlık Çerçevesi Çekirdeği'ne kullanarak veritabanlarına ASP.NET
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.cshtml
Otomatik 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.cshtml
Otomatik 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; } // 追加
// 省略
}
TestDatabaseDbContext
TestDatabaseDbContextEx
Appsettings.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; } // 追加
// 省略
}
TestDatabaseDbContext
TestDatabaseDbContextEx
Appsettings.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();
}