مقدمه

در درس قبل، با معماری و مفاهیم پایه‌ای 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 استفاده خواهیم کرد. دستورات زیر را در کنسول پکیج منیجر یا ترمینال در پوشه‌ی پروژه اجرا کنید:

Copy Icon 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)] مشخص شده تا فقط تاریخ (بدون زمان) نمایش داده شود. این مدل پایه‌ای برای ذخیره اطلاعات فیلم‌ها در پایگاه داده خواهد بود.

Copy Icon 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).

Copy Icon 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 انجام می‌شود.

  1. رشته‌ی اتصال (connection string) را در فایل appsettings.json اضافه می‌کنیم.
  2. DbContext را به عنوان یک سرویس با استفاده از متد AddDbContext ثبت می‌کنیم.
Copy Icon appsettings.json
{
  "Logging": { ... },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "WebAppDbContext": "Server=(localdb)\\mssqllocaldb;Database=WebAppDb;Trusted_Connection=True;"
  }
}
Copy Icon Program.cs
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Add the DbContext to the DI container.
builder.Services.AddDbContext<WebAppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("WebAppDbContext")));

var app = builder.Build();

// ... rest of the file

در این کد، ما WebAppDbContext را به کانتینر سرویس اضافه کرده و به آن می‌گوییم که از SQL Server استفاده کند و رشته‌ی اتصال را از بخش ConnectionStrings در فایل پیکربندی بخواند.

قدم پنجم: ایجاد پایگاه داده با Migrations

این مرحله دقیقاً مانند قبل است. از آنجایی که ما یک مدل جدید (Movie) و یک DbContext جدید داریم، باید یک Migration جدید ایجاد کرده و آن را به پایگاه داده اعمال کنیم.

Copy Icon Package Manager Console
add-migration InitialCreate
update-database

پس از اجرای این دستورات، EF Core پایگاه داده‌ی WebAppDb و جدول Movie را بر اساس مدل ما ایجاد خواهد کرد. اکنون اپلیکیشن وب ما برای تعامل با پایگاه داده کاملاً آماده است.