Προετοιμασία για πρόσβαση στον 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 αναφέρθηκε παραπάνω, κάθε στήλη στον πίνακα δηλώνεται ως ιδιότητα, επομένως είναι δυνατή η ανάκτηση της τιμής μεμονωμένα.