הכנה לגישה ל- 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, כל עמודה בטבלה מוצהרת כמאפיין, כך שניתן לאחזר את הערך בנפרד.