הכנה לגישה ל- SQL Server באמצעות Entity Framework Core (מסד נתונים תחילה)
סביבת הפעלה
- Visual Studio
-
- Visual Studio 2022
- .רשת
-
- .NET 8
- ליבת מסגרת ישות
-
- Entity Framework Core 8.0
- שרת SQL
-
- שרת SQL 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, כך שאם ברצונך לדעת כיצד להגדיר אותו, עיין בו.
יצירת טבלה
הפעם, ניצור את מסד הנתונים והטבלה הבאים כמר / גב'.
- שם מסד הנתונים: TestDatabase
- שם טבלה: משתמש
- עמודות טבלה: [מזהה], [שם], [סיסמה], [גיל], [דוא"ל], [יום הולדת], [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
קבל חבילה לשימוש ב- Entity Framework Core עם NuGet.
לחץ באמצעות לחצן העכבר הימני על יחסי התלות ובחר נהל חבילות NuGet.
כאשר "עיון" נבחר מהכרטיסייה, הזן בשדה החיפוש EntityFrameworkCore
. לאחר מכן אתה אמור לראות את החבילות הקשורות לליבה של Entity Framework ברשימה.
מכיוון שנשתמש הפעם ב- SQL Server, נתקין את החבילות הבאות.
- Microsoft.EntityFrameworkCore
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore
בדוגמה זו, אנו מתקינים . התקן גם את שני האחרים.
בחר את יעד ההתקנה ולחץ על הלחצן התקן. עבור הגירסה, בחר את היציבה העדכנית ביותר.
תיבת הדו-שיח היא בעצם בסדר ואתה יכול ללחוץ על אישור.
התקן גם את שני האחרים.
אני חושב שהחבילה נראית כך:
יצירת מודל (קוד) ממבנה טבלה של מסד נתונים
כדי שהמודל וקוד אחר ייווצרו באופן אוטומטי, תחילה בנה את הפרוייקט כדי לוודא שאין שגיאות. אם קיימת שגיאה, יצירת המודל נכשלת. אם כבר וידאת שאין שגיאות, אינך צריך לבנות אותו.
מתוך Visual Studio, פתח את מסוף מנהל החבילות. אם אין לך אחד, אתה יכול לפתוח אותו מהתפריט "כלים", "NuGet מנהל החבילה", "מסוף מנהל החבילות".
החלון הבא יוצג, לכן ודא כי "פרויקט ברירת מחדל" בפינה השמאלית העליונה הוא הפרויקט שעבורו ברצונך ליצור מודל. (עליך להיזהר אם יש לך מספר פרויקטים)
הזן את הטקסט הבא בשדה הקלט: הפרמטרים משתנים בהתאם לסביבה, לכן אנא שנו אותם בהתאם להסברים הבאים במועד.
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
תיאור פרמטרדוגמה | לפרמטרים | |
---|---|---|
ספק | עבור SQL Server, הוא Microsoft.EntityFrameworkCore.SqlServer קבוע. |
Microsoft.EntityFrameworkCore.SqlServer |
חיבור | מחרוזת החיבור להתחברות למסד הנתונים. ניתן להשתמש במחרוזות חיבור במשותף עם אפליקציות אחרות, לכן פעל בהתאם לסימון מחרוזות החיבור כדי לציין את התוכן. באפשרותך להשתמש באימות Windows או באימות SQL Server. אגב, הוא משמש רק באופן זמני כדי ליצור מודל, ולכן אין צורך להיות מודעים לאבטחה לאחר פרסום היישום עבור מחרוזת חיבור זו. אם יש לך סמלים בסיסמה, היזהר מלברוח. | "מקור נתונים=ServerName\SQLEXPRESS; מסד נתונים=TestDatabase; מזהה משתמש=UserName; password=**********" |
f | גם אם התוכנית כבר קיימת, היא תוחלף בכוח. | אין <> |
OutputDir | נתיב התיקיה שבו ברצונך להפיק את הקוד. נתיב יחסית לתיקיית הפרוייקט | מודלים\מסד נתונים |
הקשר | שמות מחלקות הקשר בעת שימוש במסגרת הישות | TestDatabaseDbContext |
UseDatabaseNames | אם צוין, שם הטבלה של מסד הנתונים יהיה שם המחלקה כפי שהוא. אם לא צוין, המקרה של שם המחלקה של הישות מותאם בהתאם לכללים. | אין <> |
ביאורי נתונים | כאשר צוין אחרת, סוג העמודה מצרף באופן אוטומטי את התכונה DataAnnotation לכל מאפיין. זה קצת שימושי אם אתה רוצה לבצע בדיקות קלט באופן אוטומטי בהתאם לסוג מסד הנתונים. | אין <> |
Namespace | מרחב השמות שאליו שייכת מחלקת הישות שנוצרה. אם לא צוין, מרחב השמות נקבע בהתאם לתיקייה. | מרחב 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
השאר נעשה באמצעות שיטות וJsonSerializer.Serialize
- כדי User
להציג את המידע בקונסולה.
כאמורUser
, כל עמודה בטבלה מוצהרת כמאפיין, כך שניתן לאחזר את הערך בנפרד.