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