۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از EF Core به عنوان پایگاه داده درون حافظه در ASP.NET Core 6

Entity Framework Core به شما اجازه می دهد تا داده ها را به و از یک پایگاه داده درون حافظه ذخیره و بازیابی کنید. این یک راه سریع و آسان برای آزمایش برنامه های وب ASP.NET Core 6 شما است.

Entity Framework Core به شما اجازه می دهد تا داده ها را به و از یک پایگاه داده درون حافظه ذخیره و بازیابی کنید. این یک راه سریع و آسان برای آزمایش برنامه های وب ASP.NET Core 6 شما است.

دلایل زیادی وجود دارد که ممکن است بخواهید هنگام کار بر روی برنامه های وب ASP.NET Core 6 از یک پایگاه داده در حافظه استفاده کنید. شاید شما در حال توسعه یک ویژگی جدید هستید و می خواهید آن را بدون تأثیر بر پایگاه داده تولید خود آزمایش کنید. یا شاید می خواهید راهی سریع برای نمونه سازی اولیه چیزی بدون راه اندازی یک پایگاه داده کاملاً جدید داشته باشید.

Entity Framework Core یا به اختصار EF Core، دسترسی به داده‌ها را در برنامه‌های NET Core ساده می‌کند و به شما امکان می‌دهد برای انجام عملیات CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) بدون تعامل مستقیم با ارائه‌دهنده پایگاه داده، کد بنویسید. ارائه دهنده پایگاه داده EF Core در حافظه به ما امکان می دهد برای آزمایش از EF Core با یک پایگاه داده در حافظه استفاده کنیم.

ارائه‌دهنده پایگاه داده EF Core در حافظه به ما امکان می‌دهد داده‌ها را به و از حافظه در برنامه‌های NET Core 6 ذخیره و بازیابی کنیم. فقط به یاد داشته باشید که این ارائه دهنده فقط برای اهداف آزمایشی طراحی شده است.

این مقاله نحوه استفاده از EF Core را با پایگاه داده درون حافظه در برنامه ASP.NET Core 6 مورد بحث قرار می دهد. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید یک پروژه ASP.NET Core در Visual Studio 2022 ایجاد کنیم. با دنبال کردن این مراحل، یک پروژه ASP.NET Core 6 Web API جدید در Visual Studio 2022 ایجاد می شود:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید. تنظیم «نوع احراز هویت» را روی «هیچ» (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس‌های «Enable Docker»، «Configure for HTTPS» و «Enable Open API Support» علامت نخورده باشند زیرا ما در اینجا از هیچ یک از این ویژگی‌ها استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.

ما از این پروژه ASP.NET Core 6 Web API برای کار با EF Core و پایگاه داده درون حافظه در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

EF Core چیست؟ چه زمانی باید از آن استفاده کنیم؟

EF Core یک ORM سبک، منبع باز و قابل توسعه (Object Relational Mapper) است که چندین ارائه دهنده پایگاه داده از جمله SQLite، MySQL، PostgreSQL و Microsoft SQL Server را پشتیبانی می کند. (لیست کاملی از ارائه دهندگان EF Core اینجا.) و همانطور که اشاره کردیم، EF Core از ذخیره و بازیابی داده ها به و از حافظه با استفاده از ارائه دهنده پایگاه داده درون حافظه خود پشتیبانی می کند.

معرفی HTMX: HTML پویا بدون جاوا اسکریپت

EF Core همچنین از LINQ (پرس و جوی یکپارچه زبان) پشتیبانی می کند که نوشتن پرس و جوها را در برابر داده های پایگاه داده شما آسان تر می کند. این به این دلیل است که LINQ به شما امکان می دهد به جای SQL یا زبان پرس و جوی دیگر، پرس و جوها را مستقیماً در C# بنویسید.

قابلیت ذخیره و بازیابی داده‌ها در حافظه با استفاده از ارائه‌دهنده پایگاه داده EF Core In-Memory به ویژه برای آزمایش برنامه‌ها یا ساخت برنامه‌هایی که نیاز به ذخیره موقت داده‌ها دارند، مناسب است. و از آنجایی که یک پایگاه داده در حافظه هم سریع و هم سریع راه اندازی می شود، استفاده از آن برای آزمایش واحد بسیار مفید است.

پایگاه داده در حافظه چیست؟

پایگاه داده درون حافظه پایگاه داده ای است که به جای دیسک فیزیکی در حافظه فرار قرار دارد. به طور طبیعی، خواندن و نوشتن برای یک پایگاه داده در حافظه، چندین برابر سریعتر از یک پایگاه داده مبتنی بر دیسک است، زیرا برنامه نیازی به صبر کردن ندارد تا داده ها به صورت فیزیکی روی دیسک نوشته یا خوانده شوند. خواندن و نوشتن داده‌های ذخیره شده بر روی یک دیسک فیزیکی یک عملیات فشرده منابع است.

پایگاه داده های درون حافظه اغلب برای اهداف کش استفاده می شوند، زیرا می توانند یک کپی از داده های اغلب استفاده شده را برای دسترسی سریع در حافظه نگه دارند. همچنین می‌توانید از پایگاه‌های داده درون حافظه برای ذخیره داده‌های گذرا، یعنی داده‌هایی که نیازی به نگهداری روی دیسک ندارند، استفاده کنید.

استفاده از پایگاه داده درون حافظه دارای معایب قابل توجهی نیز می باشد، اگرچه این موارد برای استفاده تولیدی اعمال می شود و نه سناریوی آزمایش ما. یکی از این موارد این است که اگر از یک پایگاه داده در حافظه استفاده می‌کنید، زمانی که برنامه متوقف می‌شود، داده‌ها باقی نمی‌مانند (مگر اینکه اقداماتی برای تداوم آن انجام دهید). این بدان معنی است که اگر برنامه از کار بیفتد، تمام داده های موجود در پایگاه داده درون حافظه از بین می رود.

یک نکته منفی دیگر این است که یک پایگاه داده درون حافظه در مقایسه با پایگاه داده سنتی که روی یک دیسک فیزیکی قرار دارد از حافظه بسیار بیشتری استفاده می کند (و حافظه بسیار گرانتر از ذخیره سازی دیسک است). در نتیجه، یک پایگاه داده در حافظه ممکن است برای برنامه هایی که با حجم زیادی از داده سروکار دارند مناسب نباشد. اما باز هم، این نکات منفی واقعاً در مورد استفاده از پایگاه داده درون حافظه برای آزمایش صدق نمی کند.

استفاده از پایگاه داده در حافظه در ASP.NET Core 6

در این بخش بررسی خواهیم کرد که چگونه می توانیم از یک پایگاه داده در حافظه برای ذخیره و بازیابی داده ها در یک برنامه ASP.NET Core 6 استفاده کنیم. ما این مراحل را برای ایجاد و استفاده از یک پایگاه داده در حافظه در ASP.NET Core 6 دنبال می کنیم:

  1. بسته EF Core InMemory NuGet را نصب کنید
  2. یک کلاس سفارشی جدید DbContext ایجاد کنید
  3. کلاس های مدل را ایجاد کنید
  4. کلاس Repository را ایجاد کنید
  5. مخزن را به عنوان یک سرویس به ظرف اضافه کنید
  6. یک کنترلر جدید ایجاد کنید
  7. از تزریق وابستگی در کنترلر برای دسترسی به نمونه مخزن استفاده کنید
  8. برنامه را اجرا کنید
10 اصل برای ایجاد یک تجربه توسعه دهنده عالی

بیایید شروع کنیم!

بسته EF Core InMemory NuGet را نصب کنید

برای استفاده از قابلیت های حافظه داخلی EF Core در برنامه خود، باید بسته Microsoft.EntityFrameworkCore.InMemory را به پروژه خود اضافه کنید. برای انجام این کار، پروژه را در پنجره Solution Explorer انتخاب کنید، سپس راست کلیک کرده و “Manage NuGet Packages” را انتخاب کنید. در پنجره NuGet Package Manager، بسته Microsoft.EntityFrameworkCore.InMemory را جستجو کرده و آن را نصب کنید.

همچنین، می‌توانید بسته را از طریق کنسول NuGet Package Manager با وارد کردن دستور زیر نصب کنید.

PM> Install-Package Microsoft.EntityFrameworkCore.InMemory

یک کلاس DbContext سفارشی در ASP.NET Core 6 ایجاد کنید

در EF Core، برنامه کاربردی از DbContext برای تعامل با پایگاه داده زیربنایی استفاده می کند. قبل از ادامه، اجازه دهید یک کلاس DbContext سفارشی ایجاد کنیم که از آن برای گسترش کلاس DbContext در چارچوب EF Core استفاده می کنیم.

using EFCoreInMemoryDbDemo.Models;
using Microsoft.EntityFrameworkCore;
namespace EFCoreInMemoryDbDemo
{
    public class ApiContext : DbContext
    {
        protected override void OnConfiguring
       (DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseInMemoryDatabase(databaseName: "AuthorDb");
        }
        public DbSet<Author> Authors { get; set; }
        public DbSet<Book> Books { get; set; }
    }
}

توجه داشته باشید که چگونه نام پایگاه داده درون حافظه را در روش OnConfiguring تعیین کرده ایم.

کلاس های مدل را در ASP.NET Core 6 ایجاد کنید

ما در این برنامه از دو کلاس مدل ساده برای کار با داده ها استفاده خواهیم کرد. این کلاس های مدل نویسنده و کتاب هستند. یک فایل .cs جدید با نام Author.cs ایجاد کنید و کد زیر را وارد کنید:

    public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public List<Book> Books { get; set; }
    }

فایل .cs دیگری با نام Book.cs ایجاد کنید و کد زیر را به آن بدهید:

    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public Author Author { get; set; }
    }

یک کلاس Repository در ASP.NET Core 6 ایجاد کنید

یک رابط به نام IAuthorRepository در فایلی با همین نام با پسوند cs ایجاد کنید و کد زیر را در آنجا بنویسید:

public interface IAuthorRepository
{
    public List<Author> GetAuthors();
}

کلاس AuthorRepository اعضای رابط IAuthorRepository را همانطور که در لیست کد زیر نشان داده شده است پیاده سازی می کند.

using EFCoreInMemoryDbDemo.Models;
using Microsoft.EntityFrameworkCore;
namespace EFCoreInMemoryDbDemo
{
    public class AuthorRepository : IAuthorRepository
    {
        public AuthorRepository()
        {
            using (var context = new ApiContext())
            {
                var authors = new List<Author>
                {
                new Author
                {
                    FirstName ="Joydip",
                    LastName ="Kanjilal",
                       Books = new List<Book>()
                    {
                        new Book { Title = "Mastering C# 8.0"},
                        new Book { Title = "Entity Framework Tutorial"},
                        new Book { Title = "ASP.NET 4.0 Programming"}
                    }
                },
                new Author
                {
                    FirstName ="Yashavanth",
                    LastName ="Kanetkar",
                    Books = new List<Book>()
                    {
                        new Book { Title = "Let us C"},
                        new Book { Title = "Let us C++"},
                        new Book { Title = "Let us C#"}
                    }
                }
                };
                context.Authors.AddRange(authors);
                context.SaveChanges();
            }
        }
        public List<Author> GetAuthors()
        {
            using (var context = new ApiContext())
            {
                var list = context.Authors
                    .Include(a => a.Books)
                    .ToList();
                return list;
            }
        }
    }
}

توجه داشته باشید که چگونه DbContext سفارشی که قبلا ایجاد کردیم در کلاس AuthorRepository برای ذخیره و بازیابی داده ها به و از پایگاه داده درون حافظه استفاده می شود.

اپل WebKit را به GitHub منتقل می کند

سرویس Repository را به ظرف خدمات در ASP.NET Core 6 اضافه کنید

برای استفاده از تزریق وابستگی در کنترل‌کننده‌ها یا کلاس‌های دیگر پروژه، باید سرویس‌ها را به ظرف تزریق وابستگی اضافه کنید.

برای افزودن سرویس AuthorRepository به ظرف، خط کد زیر را در فایل Program.cs اضافه کنید.

builder.Services.AddScoped<IAuthorRepository, AuthorRepository>();

در اینجا کد منبع کامل فایل Program.cs برای مرجع شما آمده است:

using EFCoreInMemoryDbDemo;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IAuthorRepository, AuthorRepository>();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

یک کنترلر Web API در ASP.NET Core 6 ایجاد کنید

تا اینجا خیلی خوبه. اکنون روی پوشه Controllers solution کلیک راست کرده، روی «Add -> Controller…» کلیک کنید و یک کنترلر API جدید در پروژه خود ایجاد کنید. نام کنترل کننده را AuthorController بگذارید و کد تولید شده پیش فرض را با کد زیر جایگزین کنید:

using EFCoreInMemoryDbDemo.Models;
using Microsoft.AspNetCore.Mvc;
namespace EFCoreInMemoryDbDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthorController : ControllerBase
    {
        readonly IAuthorRepository _authorRepository;
        public AuthorController(IAuthorRepository authorRepository)
        {
            _authorRepository = authorRepository;
        }
        [HttpGet]
        public ActionResult<List<Author>> Get()
        {
            return Ok(_authorRepository.GetAuthors());
        }
    }
}

توجه داشته باشید که چگونه از تزریق وابستگی برای تزریق نمونه ای از نوع IAuthorRepository در سازنده کلاس AuthorController استفاده شده است. روش عمل HttpGet از کلاس AuthorController، متد GetAuthors از کلاس AuthorRepository را فراخوانی می کند و لیستی از نویسندگان را برمی گرداند.

در نهایت، هنگامی که برنامه را اجرا می کنید و با استفاده از Postman، نقطه پایانی HttpGet AuthorController را می زنید، باید خروجی را همانطور که در شکل ۱ در زیر نشان داده شده است، مشاهده کنید.

ef core در پایگاه داده حافظه 01

شکل ۱. آزمایش پایگاه داده ساده درون حافظه ما ایجاد شده با ASP.NET Core 6 و EF Core.

این یک پیاده‌سازی مینیمالیستی از یک برنامه وب ASP.NET Core 6 بود که هدف اصلی آن نشان دادن نحوه کار با پایگاه داده درون حافظه با استفاده از EF Core بود. شما باید کد سفارشی خود را بنویسید تا شناسه های هر دو کلاس مدل تولید شود. علاوه بر این، ممکن است از تست‌های واحد برای آزمایش نقاط پایانی در برنامه خود استفاده کنید. همانطور که ممکن است انتظار داشته باشید، تست‌های واحدی که از ارائه‌دهنده پایگاه داده درون حافظه هسته EF استفاده می‌کنند بسیار سریع اجرا می‌شوند.