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

Techboy

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

نحوه استفاده از انواع کوئری EF Core در ASP.NET Core 7

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

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

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

هنگام کار با ORM ها، اغلب از مدل هایی استفاده می کنیم که به جداول پایگاه داده نگاشت می شوند. با این حال، اگر مدلی داشته باشیم که جدول پایگاه داده را تقلید نکند، چه؟ چگونه می توانیم انواع غیر موجودیت را نقشه برداری کنیم و اشیاء چنین مدلی را در برنامه های خود پر کنیم؟ ما می توانیم این کار را با انواع پرس و جو انجام دهیم.

در ابتدا در EF Core 2.1 معرفی شد، انواع پرس و جو انواع غیر موجودیتی (کلاس ها) هستند که می توانند به جداول یا نماهای پایگاه داده بدون ستون هویت مشخص شده نگاشت شوند، یعنی جداول و نماهایی که فاقد کلید هستند. انواع پرس و جو EF Core پرس و جو از نماها و انواع مدل هایی که نیازی به ستون های هویت ندارند را ساده تر می کند. با این حال، از آنجایی که انواع پرس و جو ستون هویتی تعریف شده ندارند، نمی‌توانید داده‌ها را با استفاده از آنها درج، به‌روزرسانی یا حذف کنید. می توانید از آنها فقط برای بازیابی داده ها استفاده کنید.

انواع پرس و جو به شما این امکان را می دهند که یک نگاشت بین کوئری پایگاه داده و کلاس های دامنه خود را مشخص کنید. سپس می توانید از همان نوع پرس و جو با انواع مختلف جستارهای EF Core مانند LINQ به Entities یا EF Core Migrations استفاده کنید.

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

زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ

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

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

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

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

کار با انواع پرس و جو در ASP.NET Core 7

بیایید با ایجاد چند موجودیت که بتوانیم آنها را پرس و جو کنیم شروع کنیم. ما از دو کلاس زیر، Teacher و Batch، در مثال خود استفاده خواهیم کرد.

 
    public class Teacher
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public ICollection<Batch> Batches { get; set; }
    }
    public class Batch
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int NoOfStudents { get; set; }
        public int TeacherId { get; set; }
    }

یک نمای در پایگاه داده خود ایجاد کنید

اکنون با کد زیر در پایگاه داده خود یک نمای به نام BatchDetails ایجاد کنید. ما از انواع پرس و جو برای نگاشت به این نما استفاده خواهیم کرد.

 
Create View BatchDetails AS
Select t.FirstName, t.LastName, t.BatchTitle, t.NoOfStudents as Total_Students
From Teacher t
Join Batch b on b.Id = t.Id

ما همچنین به کلاسی نیاز داریم که بتوان از آن برای ذخیره داده های بازیابی شده از نمای نمایشی که ایجاد کردیم استفاده کرد. قطعه کد زیر نشان می دهد که چگونه می توانید کلاسی به نام BatchDetails برای ذخیره داده های درخواست شده از view ایجاد کنید.

 
public class BatchDetails
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Title { get; set; }
        public int NoOfStudents { get; set; }
    }

نوع پرس و جو را در EF Core پیکربندی کنید

شما دو راه برای پیکربندی نوع پرس و جو دارید. اگر می خواهید از بهم ریختن DbContext خودداری کنید، می توانید کلاس DbContext خود را به عنوان یک کلاس جزئی ایجاد کنید و سپس اعلان DbQuery را به طور کلی به یک فایل جداگانه تقسیم کنید.

اسناد ساده تر با صفحات GitHub

در اینجا محتوای فایل DemoDbContext.cs آمده است:

 
public partial class DemoDbContext : DbContext
    {
        public DbSet<Teacher> Teachers { get; set; }
        public DbSet<Batch> Batches { get; set; }
    }

و اینجا محتوای فایل DemoDbContextQuery.cs است:

 
public partial class DemoDbContext : DbContext
    {
        public DbQuery<BatchDetails> Batches { get; set; }
    }

شما باید نوع پرس و جو را در روش OnModelCreating همانطور که در قطعه کد زیر نشان داده شده است پیکربندی کنید.

 
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Query<BatchDetails>().ToView("BatchDetails");
}

یک مخزن در ASP.NET Core ایجاد کنید

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

چگونه در برابر تعصب هوش مصنوعی اقدام کنیم

یک فایل با نام IBatchRepository.cs با کد زیر ایجاد کنید. IBatchRepository به عنوان رابط برای BatchDetailsRepository ما عمل خواهد کرد.

 
public interface IBatchDetailsRepository
    {
        public List<BatchDetails> GetBatchDetails();
    }

فایل دیگری به نام BatchDetailsRepository.cs ایجاد کنید و کد زیر را برای ایجاد کلاس مخزن وارد کنید.

 
    public class BatchDetailsRepository: IBatchDetailsRepository
    {
        private DemoDbContext dbContext;
        public BatchDetailsRepository(DemoDbContext demoDbContext)
        {
            dbContext = demoDbContext;
        }
        public List<BatchDetails> GetBatchDetails()
        {
            return dbContext.BatchDetails.ToList();
        }
    }

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

اکنون، یک کنترلر API به نام BatchDetailsController در فایلی با همین نام و پسوند cs. ایجاد کنید. سپس کد زیر را در آنجا بنویسید.

 
    [Route("api/[controller]")]
    [ApiController]
    public class BatchDetailsController : ControllerBase
    {
        private IBatchDetailsRepository _batchDetailsRepository;
        public BatchDetailsController(IBatchDetailsRepository
        batchDetailsRepository)
        {
            _batchDetailsRepository = batchDetailsRepository;
        }
        [HttpGet]
        public IActionResult Get()
        {
            return Ok(_batchDetailsRepository.GetBatchDetails());
        }
    }

به فهرست کد قبلی مراجعه کنید. توجه داشته باشید که چگونه تزریق وابستگی برای تزریق نمونه ای از نوع IBatchDetailsRepository در سازنده کلاس BatchDetailsController استفاده شده است.

شما می توانید انواع پرس و جو را از پرس و جوهای SQL خام با استفاده از روش FromSql در نوع DbQuery برگردانید و آنها می توانند در روابط نیز شرکت کنند.

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