التحضير للوصول إلى SQL Server باستخدام Entity Framework Core (قاعدة البيانات أولا)

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التشغيل

فيجوال ستوديو
  • فيجوال ستوديو 2022
.صافي
  • .NET 8
جوهر إطار عمل الكيان
  • إطار عمل الكيان الأساسي 8.0
خادم SQL
  • خادم SQL 2022

* ما ورد أعلاه هو بيئة تحقق ، ولكنه قد يعمل مع إصدارات أخرى.

في البداية

Entity Framework Core هي مكتبة من مصممي O / R. عند الوصول إلى قاعدة البيانات ، يمكنك الوصول إلى سجلات قاعدة البيانات من خلال النماذج (الفئات) المحددة في التعليمات البرمجية ، دون استخدام عبارات SQL مباشرة. هذا يوفر الفوائد التالية:

  • نظرا لعدم كتابة عبارات SQL مباشرة ، يتم تقليل مخاطر الأمان مثل حقن SQL.
  • نظرا لأن عبارات SQL عبارة عن سلاسل ، حتى إذا ارتكبت خطأ في بناء الجملة ، فلن يتم التحقق من وجود أخطاء في الإنشاء ، ولكن نظرا لأن النموذج عبارة عن بناء جملة برنامج ، يمكنك التحقق من وجود أخطاء في وقت الإنشاء.

يمكن ل Entity Framework Core إنشاء تعليمات برمجية تلقائيا من قواعد البيانات الموجودة للاتصال بهذه النماذج وقواعد البيانات. على العكس من ذلك ، هناك طريقة لكتابة التعليمات البرمجية يدويا ثم إنشاء قاعدة البيانات تلقائيا.

الأول يسمى "قاعدة البيانات أولا" والأخير يسمى "الكود أولا". هناك أيضا "النموذج أولا" ، والذي ينشئ التعليمات البرمجية وقواعد البيانات من المخططات مثل مخططات التقارير الإلكترونية ، ولكنه لا يستخدم على نطاق واسع في Entity Framework Core.

في هذه الحالة ، سنستخدم نمط "قاعدة البيانات أولا" الذي ينشئ رمزا على افتراض أن قاعدة البيانات موجودة بالفعل.

إعداد SQL Server

للوصول إلى قاعدة بيانات SQL Server في هذه التلميح ، يرجى إعداد SQL Server مسبقا. يمكن إعداده على جهاز كمبيوتر في بيئة التطوير أو على جهاز كمبيوتر آخر عبر الشبكة. إذا كان بإمكانك الاتصال ب SQL Server من بيئة التطوير الخاصة بك ، فأنت على ما يرام. في هذا التلميح، يتم تثبيت SQL Server في بيئة منفصلة.

يتم حذف خطوات إعداد SQL Server لأنها زائدة عن الحاجة. تحتوي الصفحات التالية على تلميحات متعلقة ب SQL Server ، لذلك إذا كنت تريد معرفة كيفية إعداده ، فيرجى الرجوع إليه.

إنشاء جدول

هذه المرة ، سنقوم بإنشاء قاعدة البيانات والجدول التاليين كالسيد / السيدة.

  • اسم قاعدة البيانات: TestDatabase
  • اسم الجدول: المستخدم
  • أعمدة الجدول: [المعرف]، [الاسم]، [كلمة المرور]، [العمر]، [البريد الإلكتروني]، [تاريخ الميلاد]، [تاريخ التحديث]

يمكنك إنشائه بأي شكل من الأشكال ، ولكن إذا كنت لا تريد القيام بذلك ، فقم بتشغيل SQL التالي مقابل SQL Server لإنشائه.

ما يلي هو SQL لإنشاء قاعدة البيانات ، ولكن نظرا لأن مسار إنشاء قاعدة البيانات يتغير اعتمادا على الإصدار ، وما إلى ذلك ، فقد يكون من الأكثر موثوقية إنشائه باستخدام واجهة المستخدم الرسومية أو الأمر بدلا من 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

إعداد الاستوديو المرئي

نفترض أنك قمت بالفعل بإعداد هذا أيضا. إذا كنت تريد معرفة إجراء الإعداد ، وما إلى ذلك ، تلخيصه في الصفحة التالية.

إنشاء مشروع

لا يعتمد 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 في هذا المثال ، نقوم بتثبيت . تثبيت الاثنين الآخرين كذلك.

حدد هدف التثبيت وانقر فوق الزر تثبيت. بالنسبة للإصدار ، حدد أحدث مستقر.

مربع الحوار موافق بشكل أساسي ويمكنك النقر فوق موافق.

تثبيت الاثنين الآخرين كذلك.

أعتقد أن الحزمة تبدو كما يلي:

إنشاء نموذج (رمز) من بنية جدول قاعدة بيانات

لإنشاء النموذج والتعليمات البرمجية الأخرى تلقائيا ، قم أولا بإنشاء المشروع للتأكد من عدم وجود أخطاء. إذا كان هناك خطأ ، يفشل إنشاء النموذج. إذا كنت قد تحققت بالفعل من عدم وجود أخطاء ، فلن تحتاج إلى إنشائها.

من Visual Studio ، افتح وحدة تحكم إدارة الحزم. إذا لم يكن لديك واحد ، يمكنك فتحه من القائمة "أدوات" ، "NuGet Package Manager" ، "Package Manager Console".

سيتم عرض النافذة التالية ، لذا تأكد من أن "المشروع الافتراضي" في الزاوية اليمنى العليا هو المشروع الذي تريد إنشاء نموذج له. (عليك أن تكون حذرا إذا كان لديك مشاريع متعددة)

أدخل النص التالي في حقل الإدخال: تتغير المعلمات اعتمادا على البيئة ، لذا يرجى تغييرها وفقا للتفسيرات التالية في الوقت المناسب.

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. بالمناسبة ، يتم استخدامه مؤقتا فقط لإنشاء نموذج ، لذلك ليست هناك حاجة إلى أن تكون على دراية بالأمان بعد نشر التطبيق لسلسلة الاتصال هذه. إذا كانت لديك رموز في كلمة المرور الخاصة بك ، فاحذر من الهروب. "مصدر البيانات = اسم الخادم \ SQLEXPRESS; قاعدة البيانات = قاعدة بيانات الاختبار ؛ معرف المستخدم = اسم المستخدم ؛ كلمة المرور = ********** "
f حتى إذا كان البرنامج موجودا بالفعل ، الكتابة فوقه بالقوة. لا يوجد <>
OutputDir مسار المجلد حيث تريد إخراج التعليمات البرمجية. المسار بالنسبة إلى مجلد المشروع النماذج/قاعدة البيانات
سياق أسماء فئات السياق عند استخدام إطار عمل الكيان TestDatabaseDbContext
أسماء قاعدة بيانات الاستخدام إذا تم تحديده ، فسيكون اسم جدول قاعدة البيانات هو اسم الفئة كما هو. إذا لم يتم تحديدها، يتم ضبط حالة اسم فئة الكيان وفقا للقواعد. لا يوجد <>
شروح البيانات عند تحديده، يقوم نوع العمود تلقائيا بإلحاق سمة DataAnnotation بكل خاصية. هذا مفيد بعض الشيء إذا كنت تريد إجراء عمليات فحص الإدخال تلقائيا وفقا لنوع قاعدة البيانات. لا يوجد <>
Namespace مساحة الاسم التي تنتمي إليها فئة الكيان التي تم إنشاؤها. إذا لم يتم تحديده ، يتم تحديد مساحة الاسم وفقا للمجلد. مساحة اسم الاختبار
مساحة اسم السياق مساحة الاسم التي ينتمي إليها السياق الذي تم إنشاؤه. إذا لم يتم تحديده ، يتم تحديد مساحة الاسم وفقا للمجلد. مساحة اسم الاختبار
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 ذكر أعلاه ، يتم الإعلان عن كل عمود في الجدول كخاصية ، لذلك من الممكن استرداد القيمة بشكل فردي.