مقدمه

در درس قبل، زیرساخت اولیه‌ی کار با Entity Framework Core را با تعریف کلاس DbContext و پیکربندی اتصال به پایگاه داده، فراهم کردیم. اکنون به بخش اصلی مدل‌سازی داده می‌رسیم: تعریف مدل‌های موجودیت (Entity Models). یک مدل موجودیت، یک کلاس ساده‌ی POCO (Plain Old CLR Object) است که ساختار یک جدول در پایگاه داده‌ی ما را نمایندگی می‌کند. هر پراپرتی در این کلاس، معادل یک ستون در آن جدول خواهد بود.

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

قدم اول: تعریف کلاس موجودیت

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

Copy Icon Product.cs
public class Product
{
    // By convention, a property named 'Id' or 'ProductId' is treated as the primary key.
    public int Id { get; set; }

    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Stock { get; set; }
}

نکته‌ی کلیدی در این کلاس، پراپرتی Id است. طبق قرارداد EF Core، هر پراپرتی که نام آن Id یا [classname]Id (در اینجا ProductId) باشد، به طور خودکار به عنوان کلید اصلی (Primary Key) جدول در نظر گرفته می‌شود.

قدم دوم: افزودن DbSet به DbContext

اکنون باید به DbContext خود بگوییم که ما می‌خواهیم یک جدول برای موجودیت Product داشته باشیم. این کار با افزودن یک پراپرتی از نوع DbSet<Product> به کلاس MyDbContext انجام می‌شود.

Copy Icon MyDbContext.cs
public class MyDbContext : DbContext
{
    // This property represents the 'Products' table in the database.
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string connectionString = "Server=(localdb)\\mssqllocaldb;Database=MyFirstEfCoreDb;Trusted_Connection=True;";
        optionsBuilder.UseSqlServer(connectionString);
    }
}

نام این پراپرتی (Products) طبق قرارداد به عنوان نام جدول در پایگاه داده استفاده خواهد شد. اکنون EF Core می‌داند که ما یک جدول به نام Products می‌خواهیم که ساختار ستون‌های آن از روی پراپرتی‌های کلاس Product تعیین می‌شود.

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

مدل ما در کد آماده است، اما پایگاه داده و جدول متناظر با آن هنوز وجود ندارند. ما می‌توانستیم به صورت دستی پایگاه داده را بسازیم، اما EF Core یک ابزار بسیار قدرتمند به نام Migrations برای مدیریت ساختار پایگاه داده فراهم می‌کند. Migrations به ما اجازه می‌دهد تا تغییراتی را که در مدل خود ایجاد می‌کنیم، به صورت کدهای C# ثبت کرده و سپس آن کدها را برای به‌روزرسانی پایگاه داده اعمال کنیم.

ایجاد اولین Migration

برای ایجاد اولین Migration، از دستور add-migration در کنسول پکیج منیجر (PMC) ویژوال استودیو یا dotnet ef migrations add در .NET CLI استفاده می‌کنیم. ما باید یک نام توصیفی برای این Migration انتخاب کنیم.

Copy Icon Package Manager Console
add-migration InitialCreate

پس از اجرای این دستور، EF Core یک پوشه‌ی جدید به نام Migrations در پروژه‌ی ما ایجاد کرده و دو فایل در آن قرار می‌دهد. یکی از فایل‌ها (..._InitialCreate.cs) حاوی کدی است که نحوه‌ی ساختن جدول Products با ستون‌های صحیح را توصیف می‌کند.

اعمال Migration به پایگاه داده

در این مرحله، ما فقط "نقشه‌ی" تغییرات را ایجاد کرده‌ایم. برای اینکه این تغییرات واقعاً بر روی پایگاه داده اعمال شوند، از دستور update-database (در PMC) یا dotnet ef database update (در CLI) استفاده می‌کنیم.

Copy Icon Package Manager Console
update-database

پس از اجرای این دستور، EF Core به سرور SQL Server متصل شده، بررسی می‌کند که آیا پایگاه داده‌ی MyFirstEfCoreDb وجود دارد یا خیر (اگر نباشد، آن را می‌سازد)، و سپس کدهای Migration را اجرا کرده و جدول Products را با تمام ستون‌های آن ایجاد می‌کند. تبریک می‌گوییم، شما با موفقیت اولین پایگاه داده‌ی خود را با رویکرد Code-First ایجاد کردید!