استفاده از Entity Framework Core با console application

ASP.NET Core برای پیکربندی و استفاده از Entity Framework Core در web application بسیار آسان است. برای NET Core console application. ها هیچ مکانیزم قابل استفاده‌ای وجود ندارد اما هنوز می‌توانیم از Entity Framework Core در برنامه‌های کنسول استفاده کنیم.

استفاده از Entity Framework Core با console application

این مقاله نشان می‌دهد که چطور مقداردهی اولیه کانتکس دیتابیس را برای جداسازی کلاس و استفاده از فراخوانی‌های همزمان و غیرهمزمان Entity Framework Core در برنامه‌های کنسول NET Core. ایجاد کنیم.

آماده‌سازی پروژه برای Entity Framework Core

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

1. فایل appsettings.json را به فولدر روت (ریشه) پروژه اضافه کنید.

2. روی آن کلیک راست کرده و Properties را انتخاب کنید.

3. در قسمت تنظیمات پیشرفته (Advanced settings) مقدار Copy to Output Directory را به Copy تنظیم کنید.

4. روی ok کلیک کنید.

حالا appsettings.json را باز کرده و رشته اتصال دیتابیس را اضافه کنید.

{
    "ConnectionStrings": {
        "DefaultConnection": "Server=(local);Database=mydb;User ID=user;Password=pass;MultipleActiveResultSets=true"
    }
}

وقتی برنامه را اجرا می‌کنیم appsettings.json در طی ساخت، در فولدر Debug یا Release کپی می‌شود و ما مجبور نیستیم آن را به صورت دستی کپی کنیم. شامل رشته اتصال دیتابیس بوده و آماده برای استفاده می‌باشد.

افزودن بسته‌های NuGet

برای استفاده از Entity Framework Core و تنظیمات از فایل settings نیاز به برخی از بسته‌های NuGet داریم. این‌ها بسته‌های ضروری NuGet هستند:

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.Json

با این بسته‌های موجود آماده‌ایم تا کار را شروع کنیم.

ایجاد کانتکس دیتابیس و موجودیت‌ها

یک کانتکس دیتابیس و موجودیتی به نام PressRelease ایجاد می‌کنیم.

public class PressRelease
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Company { get; set; }
    public DateTime ReleaseDate { get; set; }
}
 
public class DotNetPagingDbContext : DbContext
{
    public DotNetPagingDbContext(DbContextOptions<DotNetPagingDbContext> options) : base(options)
    {
    }
 
    public DbSet<PressRelease> PressReleases { get; set; }
}

حالا ما کانتکس دیتابیس و یک موجودیت ساده داریم.

ساخت database context factory

قبل از استفاده از کانتکس دیتابیس نیاز به شیء options داریم که پیکربندی آن را انجام دهند. برای ایجاد کد تمیز، کلاس factory را برای کانتکس دیتابیس‌ options ایجاد می‌کنیم. کلاس factory رشته اتصال را از تنظیمات برنامه می‌خواند، شیء options را ایجاد کرده و مقداردهی اولیه کانتکس دیتابیس را به ما برمی‌گرداند.

public class DotNetPagingDbContextFactory : IDesignTimeDbContextFactory<DotNetPagingDbContext>
{
    private static string _connectionString;
 
    public DotNetPagingDbContext CreateDbContext()
    {
        return CreateDbContext(null);
    }
 
    public DotNetPagingDbContext CreateDbContext(string[] args)
    {
        if (string.IsNullOrEmpty(_connectionString))
        {
            LoadConnectionString();
        }
 
        var builder = new DbContextOptionsBuilder<DotNetPagingDbContext>();
        builder.UseSqlServer(_connectionString);
 
        return new DotNetPagingDbContext(builder.Options);
    }
 
    private static void LoadConnectionString()
    {
        var builder = new ConfigurationBuilder();
        builder.AddJsonFile("appsettings.json", optional: false);
 
        var configuration = builder.Build();
 
        _connectionString = configuration.GetConnectionString("DefaultConnection");
    }
}

در سولوشن‌های واقعی وقتی رشته اتصال خالی است، باید برخی exception ها را در متد LoadConnectionString() بگذاریم. اما به هر حال ما اکنون کلاس factory را داریم که جزئیات ایجاد کانتکس دیتابیس را پنهان می‌کند.

استفاده از کانتکس دیتابیس در برنامه کنسول

ما آماده‌ایم تا از کانتکس دیتابیس برای درخواست داده از دیتابیس استفاده کنیم. کد واقعا ساده است.

class Program
{
    static void Main(string[] args)
    {
        using (var context = new DotNetPagingDbContextFactory.CreateDbContext())
        {
            var releases = context.PressReleases.Take(5);
 
            foreach(var release in releases)
            {
                Console.WriteLine(release.Title);
            }
        }
 
        Console.WriteLine("\r\nPress any key to continue ...");
        Console.Read();
    }
}

همچنین می‌توانیم برنامه‌یمان را با استفاده از C# 7.1 تغییر دهیم و از async Main با متدهای غیرهمزمان Entity Framework Core، استفاده کنیم.

class Program
{
    static async Task Main(string[] args)
    {
        using (var context = new DotNetPagingDbContextFactory.CreateDbContext())
        {
            var releases = await context.PressReleases.Take(5).ToListAsync();
 
            foreach(var release in releases)
            {
                Console.WriteLine(release.Title);
            }
        }
 
        Console.WriteLine("\r\nPress any key to continue ...");
        Console.Read();
    }
}

در حال حاضر نسخه‌های غیرهمزمان برنامه‌یمان را داریم.

نتیجه‌گیری

Entity Framework Core می‌تواند با برنامه‌های کنسول NET Core. نیز استفاده شود. اگرچه ASP.NET Core مکانیسم بهتری برای پیکربندی برنامه و همچنین تزریق وابستگی فراهم می‌کند، می‌توانیم database context factory ساده‌ای را ایجاد کرده و برخی جزئیاتی که تمیز نیستن را از بخش‌های دیگر کد در برنامه‌یمان پنهان کنیم. همچنین ممکن است تزریق وابستگی را در برنامه‌های کنسول NET Core. داشته باشیم اما این موضوعی است که در مقاله‌های بعدی به آن خواهیم پرداخت.

دانلود نسخه ی PDF این مطلب