آماده شدن برای دسترسی به SQL Server با استفاده از Entity Framework Core (پایگاه داده-اول)

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط عملیاتی

ویژوال استودیو
  • ویژوال استودیو 2022
.خالص
  • دات نت 8
هسته فریمورک Entity
  • Entity Framework 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 است، بنابراین اگر می خواهید بدانید که چگونه آن را راه اندازی کنید، لطفا به آن مراجعه کنید.

یک جدول ایجاد کنید

این بار، ما پایگاه داده و جدول زیر را به عنوان آقا/خانم ایجاد خواهیم کرد.

  • نام پایگاه داده: TestDatabase
  • نام جدول: کاربر
  • ستون های جدول: [شناسه]، [نام]، [گذرواژه]، [سن]، [ایمیل]، [تاریخ تولد]، [UpdateDateTime]

شما می توانید آن را به هر طریقی ایجاد کنید، اما اگر نمی خواهید این کار را انجام دهید، 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 را دریافت کنید

یک بسته برای استفاده از Entity Framework Core با NuGet دریافت کنید.

روی وابستگی کلیک راست کرده و Manage NuGet Packages را انتخاب کنید.

با انتخاب "مرور" از برگه، در EntityFrameworkCore قسمت جستجو وارد کنید. سپس باید بسته های مربوط به Entity Framework Core را در لیست مشاهده کنید.

از آنجایی که این بار از SQL Server استفاده خواهیم کرد، پکیج های زیر را نصب خواهیم کرد.

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore در این مثال، ما در حال نصب هستیم. دو مورد دیگر را نیز نصب کنید.

هدف نصب را انتخاب کرده و روی دکمه Install کلیک کنید. برای نسخه، آخرین پایدار را انتخاب کنید.

دیالوگ اساسا خوب است و می توانید روی OK کلیک کنید.

دو مورد دیگر را نیز نصب کنید.

من فکر می کنم بسته به این شکل است:

ایجاد یک مدل (کد) از ساختار جدول پایگاه داده

برای اینکه مدل و سایر کدها به طور خودکار تولید شوند، ابتدا پروژه را بسازید تا مطمئن شوید که هیچ خطایی وجود ندارد. اگر خطایی وجود داشته باشد، ایجاد مدل با شکست مواجه می شود. اگر قبلا تأیید کرده اید که هیچ خطایی وجود ندارد، نیازی به ساخت آن ندارید.

از ویژوال استودیو، کنسول Package Manager را باز کنید. اگر ندارید، می توانید آن را از منوی "ابزارها"، "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
اتصال رشته اتصال برای اتصال به پایگاه داده. رشته های اتصال را می توان به طور مشترک با سایر برنامه ها استفاده کرد، بنابراین لطفا علامت رشته های اتصال را برای مشخص کردن محتویات دنبال کنید. می توانید از احراز هویت ویندوز یا احراز هویت SQL Server استفاده کنید. به هر حال، فقط به طور موقت برای ایجاد یک مدل استفاده می شود، بنابراین پس از انتشار برنامه برای این رشته اتصال، نیازی به آگاهی از امنیت نیست. اگر نمادهایی در رمز عبور خود دارید، مراقب فرار باشید. "منبع داده=نام سرور\SQLEXPRESS; پایگاه داده=TestDatabase; شناسه کاربر=نام کاربری؛ رمز عبور = **********"
f حتی اگر این برنامه از قبل وجود داشته باشد، به اجبار بازنویسی می شود. بدون <>
خروجی دیر مسیر پوشه ای که می خواهید کد را در آن خروجی دهید. مسیر مربوط به پوشه پروژه مدل ها\پایگاه داده
چهار چوب نام کلاس های زمینه هنگام استفاده از Entity Framework TestDatabaseDbContext
UseDatabaseNames در صورت مشخصه، نام جدول پایگاه داده نام کلاس همانطور که هست خواهد بود. اگر مشخص نشده باشد، مورد نام کلاس موجودیت طبق قوانین تنظیم می شود. بدون <>
حاشیه نویسی های داده هنگامی که مشخص می شود، نوع ستون به طور خودکار ویژگی DataAnnotation را به هر ویژگی اضافه می کند. اگر می خواهید به طور خودکار بررسی های ورودی را با توجه به نوع پایگاه داده انجام دهید، این کمی مفید است. بدون <>
فضای فضای نامی که کلاس موجودیت تولید شده به آن تعلق دارد. اگر مشخص نشده باشد، فضای نام با توجه به پوشه تعیین می شود. فضای نام تست
فضای ContextNamespace فضای نامی که زمینه تولید شده به آن تعلق دارد. اگر مشخص نشده باشد، فضای نام با توجه به پوشه تعیین می شود. فضای نام تست
NoOnConfiguring رشته های اتصال خام را در کد خود جاسازی نکنید. بدون <>
خیر جمع سازی اطمینان حاصل کنید که نام ویژگی های هر نام جدول در زمینه جمع نیست. بدون <>

وقتی 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 در بالا ذکر شد، هر ستون در جدول به عنوان یک ویژگی اعلام می شود، بنابراین می توان مقدار را به صورت جداگانه بازیابی کرد.