مقدمه
در درس قبل، با معماری و مفاهیم پایهای ASP.NET Core آشنا شدیم. اکنون زمان آن است که
دست به کار شده و اولین اپلیکیشن وب واقعی خود را بسازیم. تقریباً تمام اپلیکیشنهای وب نیاز به
ذخیرهسازی و بازیابی دادهها دارند. ما برای این کار، از دانش خود در زمینهی Entity Framework
Core (EF Core) که در فصل قبل آموختیم، استفاده خواهیم کرد.
در این درس، ما یک پروژهی وب جدید از نوع ASP.NET Core Web App (Razor Pages) ایجاد
کرده و سپس یک مدل موجودیت (Entity Model) و یک DbContext برای آن تعریف میکنیم. این
فرآیند بسیار شبیه به کاری است که در اپلیکیشن کنسول انجام دادیم، اما با تفاوتهای کلیدی در نحوهی
پیکربندی و تزریق وابستگیها که مختص محیط ASP.NET Core است.
قدم اول: ایجاد پروژه ASP.NET Core Razor Pages
ابتدا در ویژوال استودیو، یک پروژهی جدید ایجاد کرده و تمپلت ASP.NET Core Web
App را انتخاب میکنیم. نام پروژه را WebApp
قرار میدهیم. اطمینان حاصل کنید که گزینهی "Configure for HTTPS" فعال باشد. در این مرحله ما از
احراز هویت استفاده نخواهیم کرد.
پس از ایجاد پروژه، ساختاری شامل پوشههای wwwroot (برای فایلهای استاتیک)، Pages
(برای صفحات
وب) و فایل Program.cs را مشاهده خواهیم کرد.
قدم دوم: نصب پکیجهای EF Core
مانند قبل، برای استفاده از EF Core، باید پکیجهای لازم را نصب کنیم. ما از SQL Server به عنوان
پایگاه داده و از ابزارهای EF Core برای
Migrations استفاده خواهیم کرد. دستورات زیر را در کنسول پکیج منیجر یا ترمینال در
پوشهی پروژه اجرا کنید:
Terminal
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
قدم سوم: تعریف مدل و DbContext
حالا مدل موجودیت و DbContext خود را ایجاد میکنیم. یک پوشهی جدید به نام Data در
ریشهی
پروژه ایجاد کرده و کلاسهای زیر را در آن قرار میدهیم.
کلاس موجودیت Movie
در این مثال، کلاس Movie یک مدل ساده با پراپرتیهای Id، Title، ReleaseDate، Genre و
Price است. پراپرتی Id به طور خودکار به عنوان کلید اصلی (Primary Key) شناخته میشود.
پراپرتی
ReleaseDate با استفاده از صفت [DataType(DataType.Date)] مشخص
شده تا فقط تاریخ (بدون زمان)
نمایش داده شود. این مدل پایهای برای ذخیره اطلاعات فیلمها در پایگاه داده خواهد بود.
Movie.cs
using System.ComponentModel.DataAnnotations;
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
در اینجا ما از صفت [DataType] برای کمک به فریمورک در نحوهی نمایش فیلد
ReleaseDate در رابط
کاربری استفاده کردهایم.
کلاس DbContext
کلاس DbContext مسئول مدیریت ارتباط با پایگاه داده و نگهداری مجموعههایی از مدلها (مانند Movie)
است. این کلاس باید از DbContext ارثبری کند و یک DbSet<Movie> به عنوان پراپرتی داشته باشد تا EF
Core بتواند جدول مربوط به Movie را ایجاد و مدیریت کند. سازنده کلاس نیز باید یک شیء
DbContextOptions دریافت کند تا پیکربندی اتصال از بیرون انجام شود (مثلاً از طریق DI در
ASP.NET Core).
WebAppDbContext.cs
using Microsoft.EntityFrameworkCore;
public class WebAppDbContext : DbContext
{
public WebAppDbContext(DbContextOptions<WebAppDbContext> options)
: base(options)
{
}
public DbSet<Movie> Movie { get; set; }
}
نکته مهم: برخلاف اپلیکیشن کنسول، در ASP.NET Core ما متد
OnConfiguring را بازنویسی نمیکنیم. در عوض، یک سازنده تعریف میکنیم که یک شیء
DbContextOptions را میپذیرد. این به ما اجازه میدهد تا پیکربندی اتصال به پایگاه داده را از
خارج از این کلاس و با استفاده از سیستم تزریق وابستگی فراهم کنیم.
قدم چهارم: ثبت DbContext و پیکربندی
اکنون باید DbContext خود را به عنوان یک "سرویس" در کانتینر تزریق وابستگی ASP.NET Core ثبت کنیم. این کار در فایل Program.cs انجام میشود.
- رشتهی اتصال (connection string) را در فایل appsettings.json
اضافه میکنیم.
- DbContext را به عنوان یک سرویس با استفاده از متد AddDbContext ثبت میکنیم.
appsettings.json
{
"Logging": { ... },
"AllowedHosts": "*",
"ConnectionStrings": {
"WebAppDbContext": "Server=(localdb)\\mssqllocaldb;Database=WebAppDb;Trusted_Connection=True;"
}
}
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDbContext<WebAppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("WebAppDbContext")));
var app = builder.Build();
در این کد، ما WebAppDbContext را به کانتینر سرویس اضافه کرده و به آن میگوییم که از SQL Server استفاده کند و رشتهی اتصال را از بخش ConnectionStrings در فایل پیکربندی
بخواند.
قدم پنجم: ایجاد پایگاه داده با Migrations
این مرحله دقیقاً مانند قبل است. از آنجایی که ما یک مدل جدید (Movie) و یک DbContext جدید
داریم، باید یک Migration جدید ایجاد کرده و آن را به پایگاه داده اعمال کنیم.
Package Manager Console
add-migration InitialCreate
update-database
پس از اجرای این دستورات، EF Core پایگاه دادهی WebAppDb و جدول Movie را بر اساس
مدل ما ایجاد خواهد کرد. اکنون اپلیکیشن وب ما برای تعامل با پایگاه داده کاملاً آماده است.