Προετοιμασία για πρόσβαση στον SQL Server χρησιμοποιώντας το Entity Framework Core (πρώτα η βάση δεδομένων)
Περιβάλλον λειτουργίας
- Οπτικό στούντιο
-
- Visual Studio 2022
- .ΔΊΧΤΥ
-
- .NET 8
- Πυρήνας πλαισίου οντοτήτων
-
- Πλαίσιο οντότητας Core 8.0
- SQL Server
-
- SQL Server 2022
* Το παραπάνω είναι ένα περιβάλλον επαλήθευσης, αλλά μπορεί να λειτουργήσει με άλλες εκδόσεις.
Αρχικά
Το Entity Framework Core είναι μια βιβλιοθήκη αντιστοιχιστών O/R. Κατά την πρόσβαση στη βάση δεδομένων, μπορείτε να έχετε πρόσβαση στις εγγραφές της βάσης δεδομένων μέσω μοντέλων (κλάσεων) που ορίζονται σε κώδικα, χωρίς να χρησιμοποιείτε απευθείας προτάσεις SQL. Αυτό παρέχει τα ακόλουθα οφέλη:
- Δεδομένου ότι οι προτάσεις SQL δεν γράφονται απευθείας, μειώνονται οι κίνδυνοι ασφαλείας, όπως η έγχυση SQL.
- Δεδομένου ότι οι προτάσεις SQL είναι συμβολοσειρές, ακόμα κι αν κάνετε λάθος στη σύνταξη, δεν ελέγχεται για σφάλματα κατασκευής, αλλά επειδή το μοντέλο είναι σύνταξη προγράμματος, μπορείτε να ελέγξετε για λάθη κατά το χρόνο κατασκευής.
Το Entity Framework Core μπορεί να δημιουργήσει αυτόματα κώδικα από υπάρχουσες βάσεις δεδομένων για να συνδεθεί με αυτά τα μοντέλα και τις βάσεις δεδομένων. Αντίθετα, υπάρχει ένας τρόπος να γράψετε τον κώδικα με μη αυτόματο τρόπο και στη συνέχεια να δημιουργήσετε αυτόματα τη βάση δεδομένων.
Το πρώτο ονομάζεται "βάση δεδομένων-πρώτα" και το δεύτερο ονομάζεται "κώδικας-πρώτα". Υπάρχει επίσης το "model-first", το οποίο δημιουργεί κώδικα και βάσεις δεδομένων από σχεδιαγράμματα όπως διαγράμματα ER, αλλά δεν χρησιμοποιείται ευρέως στο Entity Framework Core.
Σε αυτήν την περίπτωση, θα χρησιμοποιήσουμε ένα μοτίβο "πρώτα η βάση δεδομένων" που δημιουργεί κώδικα με την υπόθεση ότι η βάση δεδομένων υπάρχει ήδη.
Εγκατάσταση του SQL Server
Για να αποκτήσετε πρόσβαση στη βάση δεδομένων του SQL Server σε αυτήν τη συμβουλή, ρυθμίστε τον SQL Server εκ των προτέρων. Μπορεί να ρυθμιστεί σε υπολογιστή στο περιβάλλον ανάπτυξης ή σε άλλο υπολογιστή μέσω του δικτύου. Εάν μπορείτε να συνδεθείτε στον SQL Server από το περιβάλλον ανάπτυξής σας, είστε έτοιμοι. Σε αυτήν τη συμβουλή, ο SQL Server εγκαθίσταται σε ξεχωριστό περιβάλλον.
Τα βήματα εγκατάστασης του SQL Server παραλείπονται επειδή είναι περιττά. Οι ακόλουθες σελίδες περιέχουν συμβουλές σχετικά με τον SQL Server, οπότε αν θέλετε να μάθετε πώς να το ρυθμίσετε, ανατρέξτε σε αυτό.
Δημιουργία πίνακα
Αυτή τη φορά, θα δημιουργήσουμε την ακόλουθη βάση δεδομένων και πίνακα ως Mr./Ms..
- Όνομα βάσης δεδομένων: TestDatabase
- Όνομα πίνακα: Χρήστης
- Στήλες πίνακα: [ID], [Όνομα], [Κωδικός πρόσβασης], [Ηλικία], [Email], [Γενέθλια], [UpdateDateTime]
Μπορείτε να το δημιουργήσετε με οποιονδήποτε τρόπο, αλλά εάν δεν θέλετε να το κάνετε, εκτελέστε το ακόλουθο SQL στον SQL Server για να το δημιουργήσετε.
Το παρακάτω είναι SQL δημιουργίας βάσης δεδομένων, αλλά επειδή η διαδρομή δημιουργίας βάσης δεδομένων αλλάζει ανάλογα με την έκδοση κ.λπ., μπορεί να είναι πιο αξιόπιστο να το δημιουργήσετε με GUI ή εντολή αντί για 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.
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
Εγκατάσταση του Visual Studio
Υποθέτουμε ότι το έχετε ήδη ρυθμίσει και αυτό. Εάν θέλετε να μάθετε τη διαδικασία εγκατάστασης κ.λπ., συνοψίζεται στην επόμενη σελίδα.
Δημιουργία έργου
Το Entity Framework Core δεν εξαρτάται από κάποιο συγκεκριμένο περιβάλλον εκτέλεσης, επομένως μπορεί να χρησιμοποιηθεί σε πολλά έργα. Σε αυτό το άρθρο, θα χρησιμοποιήσουμε το Entity Framework Core σε ένα απλό περιβάλλον εφαρμογής κονσόλας.
Στο νέο έργο, επιλέξτε Εφαρμογή κονσόλας.
Το έργο έχει δημιουργηθεί. Δεν έχει σημασία ποιο είναι το όνομα του έργου.
Λήψη του βασικού πακέτου πλαισίου οντοτήτων
Αποκτήστε ένα πακέτο για τη χρήση του Entity Framework Core με το NuGet.
Κάντε δεξί κλικ στην εξάρτηση και επιλέξτε Διαχείριση πακέτων NuGet.
Με επιλεγμένο το "Αναζήτηση" από την καρτέλα, εισαγάγετε στο EntityFrameworkCore
πεδίο αναζήτησης. Στη συνέχεια, θα πρέπει να δείτε τα πακέτα που σχετίζονται με το Entity Framework Core στη λίστα.
Δεδομένου ότι θα χρησιμοποιήσουμε τον SQL Server αυτή τη φορά, θα εγκαταστήσουμε τα ακόλουθα πακέτα.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
Σε αυτό το παράδειγμα, εγκαθιστούμε το . Εγκαταστήστε και τα άλλα δύο.
Επιλέξτε τον προορισμό εγκατάστασης και κάντε κλικ στο κουμπί Εγκατάσταση. Για την έκδοση, επιλέξτε το πιο πρόσφατο σταθερό.
Ο διάλογος είναι βασικά εντάξει και μπορείτε να κάνετε κλικ στο OK.
Εγκαταστήστε και τα άλλα δύο.
Νομίζω ότι το πακέτο μοιάζει με αυτό:
Δημιουργία μοντέλου (κώδικα) από δομή πίνακα βάσης δεδομένων
Για να δημιουργηθεί αυτόματα το μοντέλο και άλλος κώδικας, δημιουργήστε πρώτα το έργο για να βεβαιωθείτε ότι δεν υπάρχουν σφάλματα. Εάν υπάρχει σφάλμα, η δημιουργία του μοντέλου αποτυγχάνει. Εάν έχετε ήδη επαληθεύσει ότι δεν υπάρχουν σφάλματα, δεν χρειάζεται να το δημιουργήσετε.
Από το Visual Studio, ανοίξτε την κονσόλα διαχείρισης πακέτων. Εάν δεν έχετε, μπορείτε να το ανοίξετε από το μενού "Εργαλεία", "NuGet Package Manager", "Κονσόλα διαχείρισης πακέτων".
Θα εμφανιστεί το ακόλουθο παράθυρο, οπότε βεβαιωθείτε ότι το "Προεπιλεγμένο έργο" στην επάνω δεξιά γωνία είναι το έργο για το οποίο θέλετε να δημιουργήσετε ένα μοντέλο. (Πρέπει να είστε προσεκτικοί εάν έχετε πολλά έργα)
Εισαγάγετε το ακόλουθο κείμενο στο πεδίο εισαγωγής: Οι παράμετροι αλλάζουν ανάλογα με το περιβάλλον, οπότε αλλάξτε τις σύμφωνα με τις ακόλουθες εξηγήσεις εγκαίρως.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
Παράδειγμα εισαγωγής
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
Παράμετρος | descriptionΠαράδειγμα παραμέτρου | |
---|---|---|
Παροχέας | Για τον Microsoft.EntityFrameworkCore.SqlServer SQL Server, είναι σταθερό. |
Microsoft.EntityFrameworkCore.SqlServer |
Σύνδεση | Η συμβολοσειρά σύνδεσης για σύνδεση με τη βάση δεδομένων. Οι συμβολοσειρές σύνδεσης μπορούν να χρησιμοποιηθούν από κοινού με άλλες εφαρμογές, επομένως ακολουθήστε τη σημειογραφία των συμβολοσειρών σύνδεσης για να καθοριστούν τα περιεχόμενα. Μπορείτε να χρησιμοποιήσετε είτε τον έλεγχο ταυτότητας των Windows είτε τον έλεγχο ταυτότητας του SQL Server. Παρεμπιπτόντως, χρησιμοποιείται μόνο προσωρινά για τη δημιουργία ενός μοντέλου, επομένως δεν χρειάζεται να γνωρίζετε την ασφάλεια μετά τη δημοσίευση της εφαρμογής για αυτήν τη συμβολοσειρά σύνδεσης. Εάν έχετε σύμβολα στον κωδικό πρόσβασής σας, προσέξτε να μην ξεφύγετε. | "Προέλευση δεδομένων = όνομα_διακομιστή\ SQLEXPRESS; Βάση δεδομένων = TestDatabase; αναγνωριστικό χρήστη = Όνομα χρήστη; κωδικός πρόσβασης = **********" |
f | Ακόμα κι αν το πρόγραμμα υπάρχει ήδη, θα αντικατασταθεί βίαια. | Καμία <> |
OutputDir | Η διαδρομή φακέλου όπου θέλετε να εξάγετε τον κώδικα. Διαδρομή σχετική με το φάκελο έργου | Μοντέλα\Βάση δεδομένων |
Πλαίσιο | Ονόματα κλάσεων περιβάλλοντος κατά τη χρήση του πλαισίου οντότητας | TestDatabaseDbContext |
UseDatabaseNames | Εάν καθοριστεί, το όνομα πίνακα της βάσης δεδομένων θα είναι το όνομα κλάσης ως έχει. Εάν δεν προσδιορίζεται, η περίπτωση του ονόματος κατηγορίας οντότητας προσαρμόζεται σύμφωνα με τους κανόνες. | Καμία <> |
Σχολιασμοί δεδομένων | Όταν καθορίζεται, ο τύπος στήλης προσαρτά αυτόματα το χαρακτηριστικό DataAnnotation σε κάθε ιδιότητα. Αυτό είναι λίγο χρήσιμο εάν θέλετε να εκτελέσετε αυτόματα ελέγχους εισόδου ανάλογα με τον τύπο της βάσης δεδομένων. | Καμία <> |
Χώρος ονομάτων | Ο χώρος ονομάτων στον οποίο ανήκει η κλάση οντότητας που δημιουργείται. Εάν δεν έχει καθοριστεί, ο χώρος ονομάτων καθορίζεται σύμφωνα με το φάκελο. | TestNamespace |
ContextNamespace | Ο χώρος ονομάτων στον οποίο ανήκει το περιβάλλον που δημιουργείται. Εάν δεν έχει καθοριστεί, ο χώρος ονομάτων καθορίζεται σύμφωνα με το φάκελο. | TestNamespace |
NoOnConfiguring | Μην ενσωματώνετε μη επεξεργασμένες συμβολοσειρές σύνδεσης στον κώδικά σας. | Καμία <> |
NoPluralize | Βεβαιωθείτε ότι τα ονόματα ιδιοτήτων για κάθε όνομα πίνακα στο περιβάλλον δεν είναι πληθυντικά. | Καμία <> |
Όταν πατάτε Enter για να το εκτελέσετε, ο κώδικας δημιουργείται αυτόματα: Εάν παρουσιαστεί σφάλμα, θα εμφανιστεί ο λόγος, επομένως απαντήστε σύμφωνα με το περιεχόμενο του σφάλματος.
User
Ο κωδικός μοντέλου του πίνακα έχει ως εξής.
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; }
}
Παρεμπιπτόντως, η προειδοποίηση εμφανίζεται επειδή η συμβολοσειρά σύνδεσης γράφεται όπως είναι στον κώδικα της κλάσης περιβάλλοντος που δημιουργείται. Εάν είναι δυνατόν, η συμβολοσειρά σύνδεσης πρέπει να αποθηκευτεί σε ξεχωριστό μέρος και να ρυθμιστεί κατά το χρόνο εκτέλεσης, αλλά σε αυτήν την περίπτωση, είναι για τον έλεγχο της λειτουργίας, οπότε θα την αφήσω ως έχει.
Δοκιμάστε να ανακτήσετε και να εμφανίσετε εγγραφές
Τώρα που έχουμε τον κώδικα για πρόσβαση στις εγγραφές στη βάση δεδομένων, ας προσπαθήσουμε να ανακτήσουμε τις εγγραφές και να τις εμφανίσουμε στην κονσόλα.
Program.cs
και τροποποιήστε το ως εξής.
// 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));
}
Δημιουργήστε την κλάση new
που δημιουργείται DbContext
αυτόματα στο . Δηλώνεται έτσι ώστε οι συνδέσεις βάσης δεδομένων να μπορούν να using var
καταστραφούν αυτόματα.
dbContext
Δημιουργεί ιδιότητες για πρόσβαση σε κάθε μοντέλο, επομένως σε αυτήν την περίπτωση User
, μπορείτε να χειριστείτε τις εγγραφές στον πίνακα αποκτώντας User
πρόσβαση στις ιδιότητες.
Η SQL που εκδίδεται δημιουργείται αυτόματα εσωτερικά και δεν χρειάζεται να παρατηρηθεί.
ToList
Εδώ, χρησιμοποιείται μια μέθοδος επέκτασης για User
την ανάκτηση όλων των εγγραφών στον πίνακα.
foreach
Τα υπόλοιπα γίνονται χρησιμοποιώντας τις μεθόδους and JsonSerializer.Serialize
για την User
εμφάνιση των πληροφοριών στην κονσόλα.
Όπως User
αναφέρθηκε παραπάνω, κάθε στήλη στον πίνακα δηλώνεται ως ιδιότητα, επομένως είναι δυνατή η ανάκτηση της τιμής μεμονωμένα.