مقدمه

در درس گذشته، با مفاهیم پایه‌ای ASP.NET Core Web API و نحوه‌ی ساخت یک کنترلر ساده آشنا شدیم. اکنون زمان آن است که این دانش را برای یک سناریوی واقعی‌تر و پیچیده‌تر به کار بگیریم. در این درس، ما یک وب‌سرویس کامل برای پایگاه داده‌ی معروف Northwind خواهیم ساخت. Northwind یک پایگاه داده‌ی نمونه از مایکروسافت است که یک کسب‌وکار کوچک فروش مواد غذایی را شبیه‌سازی می‌کند و شامل جداول مرتبطی مانند Customers، Orders، Products و Suppliers است.

به جای تعریف دستی تمام مدل‌ها و DbContext (رویکرد Code-First)، ما از یک رویکرد متفاوت به نام Database-First استفاده خواهیم کرد. در این رویکرد، EF Core می‌تواند یک پایگاه داده‌ی موجود را بررسی کرده و به صورت خودکار تمام کلاس‌های موجودیت و DbContext مورد نیاز را برای ما تولید کند. این کار فرآیند شروع کار با پایگاه‌های داده‌ی موجود را به شدت سرعت می‌بخشد.

قدم اول: ایجاد پروژه و نصب پکیج‌ها

ابتدا یک پروژه‌ی جدید از نوع ASP.NET Core Web API ایجاد کرده و نام آن را Northwind.Api می‌گذاریم. سپس، پکیج‌های لازم برای EF Core را نصب می‌کنیم:

Copy Icon Terminal
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design

پکیج Microsoft.EntityFrameworkCore.Design حاوی منطق لازم برای مهندسی معکوس پایگاه داده است.

قدم دوم: مهندسی معکوس پایگاه داده (Database-First)

اکنون از ابزار خط فرمان EF Core برای تولید مدل از روی یک پایگاه داده‌ی Northwind موجود استفاده می‌کنیم. برای این کار، به یک رشته‌ی اتصال (connection string) به پایگاه داده نیاز داریم. (شما می‌توانید اسکریپت ساخت پایگاه داده‌ی Northwind را به راحتی در اینترنت پیدا کرده و آن را بر روی نمونه‌ی SQL Server خود اجرا کنید).

دستور dotnet ef dbcontext scaffold این کار را برای ما انجام می‌دهد. این دستور چندین پارامتر می‌گیرد:

  • رشته‌ی اتصال به پایگاه داده.
  • نام ارائه‌دهنده‌ی EF Core (در اینجا Microsoft.EntityFrameworkCore.SqlServer).
  • سوئیچ -o برای مشخص کردن پوشه‌ی خروجی برای مدل‌ها.
  • سوئیچ -c برای مشخص کردن نام DbContext که باید تولید شود.
Copy Icon Terminal
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Northwind;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -c NorthwindContext

پس از اجرای این دستور، EF Core به پایگاه داده متصل شده و یک پوشه‌ی Models ایجاد می‌کند که حاوی کلاس‌های C# برای تمام جداول پایگاه داده (Customer.cs, Order.cs و ...) و همچنین فایل NorthwindContext.cs است.

قدم سوم: ثبت DbContext

مانند قبل، باید DbContext تولید شده را در فایل Program.cs به کانتینر تزریق وابستگی اضافه کنیم.

Copy Icon Program.cs
using Northwind.Api.Models;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<NorthwindContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("NorthwindConnection")));

// ... other services

فراموش نکنید که رشته‌ی اتصال مربوطه را نیز در فایل appsettings.json خود اضافه کنید.

قدم چهارم: ساخت کنترلر Customers

حالا که مدل و DbContext ما آماده است، می‌توانیم با استفاده از همان ابزار Scaffolding که در درس قبل دیدیم، یک کنترلر API برای مدیریت مشتریان (Customers) ایجاد کنیم.

  1. روی پوشه‌ی Controllers راست‌کلیک کرده و AddController... را انتخاب کنید.
  2. گزینه‌ی API Controller with actions, using Entity Framework را انتخاب کنید.
  3. برای Model class، گزینه‌ی Customer را انتخاب کنید.
  4. برای Data context class، گزینه‌ی NorthwindContext را انتخاب کنید.
  5. نام کنترلر را CustomersController بگذارید و روی Add کلیک کنید.

ویژوال استودیو یک کنترلر کامل با تمام اکشن‌های CRUD برای موجودیت Customer تولید می‌کند.

بررسی اکشن GetCustomers

اکشن GET اصلی که توسط Scaffolding تولید می‌شود، تمام مشتریان را برمی‌گرداند.

Copy Icon CustomersController.cs
// GET: api/Customers
[HttpGet]
public async Task<ActionResult<IEnumerable<Customer>>> GetCustomers()
{
    return await _context.Customers.ToListAsync();
}

اگر اکنون برنامه را اجرا کرده و به آدرس /api/customers در مرورگر خود (یا با ابزاری مانند Postman) مراجعه کنید، لیستی از تمام مشتریان پایگاه داده Northwind را در فرمت JSON دریافت خواهید کرد. به همین سادگی، شما یک وب‌سرویس کاربردی برای خواندن داده‌ها از یک پایگاه داده‌ی واقعی ساختید.