Mempersiapkan untuk mengakses SQL Server menggunakan Entity Framework Core (database-first)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan operasi

Visual Studio
  • Visual Studio 2022
.JARING
  • .NET 8
Inti Kerangka Kerja Entitas
  • Inti Kerangka Kerja Entitas 8.0
SQL Server
  • Server SQL 2022

* Di atas adalah lingkungan verifikasi, tetapi mungkin berfungsi dengan versi lain.

Pada awalnya

Entity Framework Core adalah pustaka pemeta O/R. Saat mengakses database, Anda dapat mengakses catatan database melalui model (kelas) yang ditentukan dalam kode, tanpa menggunakan pernyataan SQL secara langsung. Ini memberikan manfaat berikut:

  • Karena pernyataan SQL tidak ditulis secara langsung, risiko keamanan seperti injeksi SQL berkurang.
  • Karena pernyataan SQL adalah string, bahkan jika Anda membuat kesalahan dalam sintaks, itu tidak diperiksa untuk kesalahan build, tetapi karena model adalah sintaks program, Anda dapat memeriksa kesalahan pada waktu build.

Entity Framework Core dapat secara otomatis menghasilkan kode dari database yang ada untuk terhubung ke model dan database ini. Sebaliknya, ada cara untuk menulis kode secara manual dan kemudian secara otomatis menghasilkan database.

Yang pertama disebut "database-first" dan yang terakhir disebut "code-first". Ada juga "model-first", yang menghasilkan kode dan database dari cetak biru seperti diagram ER, tetapi tidak banyak digunakan di Entity Framework Core.

Dalam hal ini, kita akan menggunakan pola "database-first" yang menghasilkan kode dengan asumsi bahwa database sudah ada.

Penyiapan SQL Server

Untuk mengakses database SQL Server dalam tip ini, harap siapkan SQL Server terlebih dahulu. Ini dapat diatur pada PC di lingkungan pengembangan atau di PC lain melalui jaringan. Jika Anda dapat tersambung ke SQL Server dari lingkungan pengembangan Anda, Anda siap melakukannya. Dalam tip ini, SQL Server diinstal di lingkungan terpisah.

Langkah-langkah penyiapan SQL Server dihilangkan karena berlebihan. Halaman berikut berisi tips terkait SQL Server, jadi jika Anda ingin tahu cara mengaturnya, silakan lihat itu.

Membuat tabel

Kali ini, kita akan membuat database dan tabel berikut sebagai Mr./Ms..

  • Nama database: TestDatabase
  • Nama tabel: Pengguna
  • Kolom tabel: [ID], [Nama], [Kata Sandi], [Usia], [Email], [Ulang Tahun], [UpdateDateTime]

Anda dapat membuatnya dengan cara apa pun, tetapi jika Anda tidak ingin melakukannya, jalankan SQL berikut terhadap SQL Server untuk membuatnya.

Berikut ini adalah SQL pembuatan basis data, tetapi karena jalur pembuatan basis data berubah tergantung pada versi, dll., Mungkin lebih dapat diandalkan untuk membuatnya dengan GUI atau perintah daripada SQL.

USE [master]
GO
CREATE DATABASE [TestDatabase]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO
ALTER DATABASE [TestDatabase] SET COMPATIBILITY_LEVEL = 160
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [TestDatabase] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [TestDatabase] SET ARITHABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [TestDatabase] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [TestDatabase] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [TestDatabase] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [TestDatabase] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [TestDatabase] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [TestDatabase] SET  DISABLE_BROKER 
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [TestDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [TestDatabase] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [TestDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [TestDatabase] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [TestDatabase] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [TestDatabase] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [TestDatabase] SET RECOVERY FULL 
GO
ALTER DATABASE [TestDatabase] SET  MULTI_USER 
GO
ALTER DATABASE [TestDatabase] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [TestDatabase] SET DB_CHAINING OFF 
GO
ALTER DATABASE [TestDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [TestDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS 
GO
ALTER DATABASE [TestDatabase] SET DELAYED_DURABILITY = DISABLED 
GO
ALTER DATABASE [TestDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF  
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestDatabase', N'ON'
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)
GO
ALTER DATABASE [TestDatabase] SET  READ_WRITE 
GO

SQL pembuatan tabel.

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

Catat Tambahkan 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

Penyiapan Visual Studio

Kami berasumsi bahwa Anda juga telah mengaturnya. Jika Anda ingin mengetahui prosedur pengaturan, dll., Ini dirangkum pada halaman berikut.

Membuat proyek

Entity Framework Core tidak bergantung pada lingkungan eksekusi tertentu, sehingga dapat digunakan di banyak proyek. Pada artikel ini, kita akan menggunakan Entity Framework Core dalam lingkungan aplikasi konsol sederhana.

Di proyek baru, pilih Aplikasi Konsol.

Proyek telah dibuat. Tidak peduli apa nama proyeknya.

Dapatkan paket Entity Framework Core

Dapatkan paket untuk menggunakan Entity Framework Core dengan NuGet.

Klik kanan dependensi dan pilih Kelola Paket NuGet.

Dengan "Telusuri" yang dipilih dari tab, masukkan di EntityFrameworkCore kolom pencarian. Anda kemudian akan melihat paket terkait Entity Framework Core dalam daftar.

Karena kami akan menggunakan SQL Server kali ini, kami akan menginstal paket-paket berikut.

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

Microsoft.EntityFrameworkCore Dalam contoh ini, kami menginstal . Instal dua lainnya juga.

Pilih target instalasi dan klik tombol Instal. Untuk versinya, pilih stabil terbaru.

Dialog pada dasarnya OK dan Anda dapat mengklik OK.

Instal dua lainnya juga.

Saya pikir paketnya terlihat seperti ini:

Membuat model (kode) dari struktur tabel database

Agar model dan kode lainnya dibuat secara otomatis, pertama-tama bangun proyek untuk memastikan tidak ada kesalahan. Jika ada kesalahan, pembuatan model gagal. Jika Anda telah memverifikasi bahwa tidak ada kesalahan, Anda tidak perlu membangunnya.

Dari Visual Studio, buka Konsol Manajer Paket. Jika Anda tidak memilikinya, Anda dapat membukanya dari menu "Alat", "Manajer Paket NuGet", "Konsol Manajer Paket".

Jendela berikut akan ditampilkan, jadi pastikan bahwa "Proyek Default" di sudut kanan atas adalah proyek yang ingin Anda buat modelnya. (Anda harus berhati-hati jika Anda memiliki banyak proyek)

Masukkan teks berikut di bidang input: Parameter berubah tergantung pada lingkungan, jadi harap ubah sesuai dengan penjelasan berikut tepat waktu.

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize

Contoh Masukan

Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=TestServer;Database=TestDatabase;user id=TestUser;password=pass;TrustServerCertificate=true" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
Deskripsi parameterContoh parameter
Penyedia Untuk SQL Server, itu Microsoft.EntityFrameworkCore.SqlServer diperbaiki. Microsoft.EntityFrameworkCore.SqlServer
Sambungan String koneksi untuk menyambungkan ke database. String koneksi dapat digunakan secara umum dengan aplikasi lain, jadi ikuti notasi string koneksi untuk konten yang akan ditentukan. Anda dapat menggunakan Autentikasi Windows atau Autentikasi SQL Server. Ngomong-ngomong, ini hanya digunakan sementara untuk membuat model, jadi tidak perlu menyadari keamanan setelah menerbitkan aplikasi untuk string koneksi ini. Jika Anda memiliki simbol di kata sandi Anda, berhati-hatilah agar tidak melarikan diri. "Sumber Data=ServerName\SQLEXPRESS; Basis Data=Basis Data Uji; id pengguna=Nama Pengguna; kata sandi = **********"
f Bahkan jika program sudah ada, itu akan ditimpa secara paksa. Tidak ada <>
Keluaran Dir Jalur folder tempat Anda ingin mengeluarkan kode. Jalur relatif ke folder proyek Model\Database
Konteks Nama kelas konteks saat menggunakan kerangka kerja entitas TestDatabaseDbContext
UseDatabaseNames Jika ditentukan, nama tabel database akan menjadi nama kelas apa adanya. Jika tidak ditentukan, huruf besar dan kecil nama kelas entitas disesuaikan sesuai dengan aturan. Tidak ada <>
Anotasi Data Saat ditentukan, jenis kolom secara otomatis menambahkan atribut DataAnnotation ke setiap properti. Ini sedikit berguna jika Anda ingin melakukan pemeriksaan input secara otomatis sesuai dengan jenis database. Tidak ada <>
Ruang nama Ruang nama tempat kelas entitas yang dihasilkan berada. Jika tidak ditentukan, namespace ditentukan sesuai dengan folder. TestNamespace
ContextNamespace Ruang nama tempat Context yang dihasilkan. Jika tidak ditentukan, namespace ditentukan sesuai dengan folder. TestNamespace
NoOnKonfigurasi Jangan sematkan string koneksi mentah dalam kode Anda. Tidak ada <>
Tidak Jamak Pastikan bahwa nama properti untuk setiap nama tabel dalam Konteks tidak berbentuk jamak. Tidak ada <>

Saat Anda menekan Enter untuk menjalankannya, kode akan dibuat secara otomatis: Jika terjadi kesalahan, alasannya akan ditampilkan, jadi harap tanggapi sesuai dengan konten kesalahan.

User Kode model tabel adalah sebagai berikut.

using System.ComponentModel.DataAnnotations;

namespace SetupSqlServerDatabaseFirst.Models.Database;

public partial class User
{
  [Key]
  public int ID { get; set; }

  [StringLength(20)]
  public string Name { get; set; } = null!;

  [StringLength(20)]
  public string Password { get; set; } = null!;

  public int? Age { get; set; }

  [StringLength(200)]
  public string? Email { get; set; }

  public DateOnly? Birthday { get; set; }

  public DateTime? UpdateDateTime { get; set; }
}

Ngomong-ngomong, peringatan ditampilkan karena string koneksi ditulis seperti dalam kode kelas konteks yang dihasilkan. Jika memungkinkan, string koneksi harus disimpan di tempat terpisah dan diatur saat runtime, tetapi dalam hal ini, ini untuk tujuan memeriksa operasi, jadi saya akan membiarkannya apa adanya.

Coba ambil dan tampilkan catatan

Sekarang setelah kita memiliki kode untuk mengakses catatan dalam database, mari kita coba mengambil catatan dan menampilkannya di konsol.

Program.cs dan modifikasi sebagai berikut.

// See https://aka.ms/new-console-template for more information
using SetupSqlServerDatabaseFirst.Models.Database;
using System.Text.Json;

Console.WriteLine("Hello, World!");

// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();

// データベースから User 一覧を取得する
var users = dbContext.User.ToList();

// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
  Console.WriteLine(JsonSerializer.Serialize(user));
}

Hasilkan kelas new yang dibuat DbContext secara otomatis di . Ini dideklarasikan sehingga koneksi database dapat using var dihancurkan secara otomatis.

dbContext menghasilkan properti untuk mengakses setiap model, jadi dalam hal ini User , Anda dapat memanipulasi catatan dalam tabel dengan User mengakses properti. SQL yang dikeluarkan secara otomatis dihasilkan secara internal dan tidak perlu diperhatikan.

ToList Di sini, metode ekstensi digunakan untuk User mengambil semua rekaman dalam tabel.

foreach Sisanya dilakukan dengan menggunakan metode dan JsonSerializer.Serialize untuk User menampilkan informasi di konsol. Seperti disebutkan User di atas, setiap kolom dalam tabel dideklarasikan sebagai properti, sehingga dimungkinkan untuk mengambil nilai satu per satu.