Entity Framework Core (EF Core) یک نگاشت شیء رابطهای (ORM) قدرتمند و منبع باز برای دات نت است. EF Core توسعه دهندگان را قادر می سازد تا با استفاده از اشیاء دات نت با یک پایگاه داده کار کنند و نیازی به اکثر کدهای دسترسی به داده که توسعه دهندگان معمولا می نویسند را از بین می برد.

EF Core چیست؟
EF Core به توسعه دهندگان این امکان را می دهد تا با استفاده از اشیاء دات نت با پایگاه های داده به روشی شهودی تر تعامل داشته باشند. به جای نوشتن پرس و جوهای پیچیده SQL، می توانید پرس و جوهای LINQ (پرس و جوی یکپارچه زبان) را بنویسید و از قابلیت های EF Core برای ترجمه آنها به SQL استفاده کنید. این رویکرد به ساده کردن دسترسی به پایگاه داده کمک می کند و تضمین می کند که برنامه شما تمیز و قابل نگهداری باقی می ماند.
ویژگی های کلیدی
1. Cross-Platform: برای کار بر روی چندین پلتفرم از جمله ویندوز، لینوکس و macOS طراحی شده است.
2. سبک وزن: این یک ORM سبک، قابل توسعه و بسیار کارآمد است.
3. مدل سازی: می توانید از EF Core برای ایجاد یک مدل بر اساس طرح پایگاه داده موجود خود استفاده کنید یا یک طرح پایگاه داده جدید از کد خود ایجاد کنید.
4. مهاجرت ها: EF Core از مهاجرت ها پشتیبانی می کند، که به شما کمک می کند تغییرات طرح های پایگاه داده را در طول زمان مدیریت کنید.
5. پشتیبانی از LINQ: به طور کامل از پرس و جوهای LINQ پشتیبانی می کند، و بازیابی داده ها را بصری تر می کند.
6. استقلال ارائه دهنده: EF Core از چندین ارائه دهنده پایگاه داده، از جمله SQL Server، SQLite، PostgreSQL و MySQL پشتیبانی می کند.
چگونه کار می کند
EF Core با نگاشت کلاس های دات نت به جداول پایگاه داده و ویژگی های دات نت به ستون های پایگاه داده کار می کند. این نگاشت در یک کلاس DbContext تعریف شده است که یک جلسه با پایگاه داده را نشان می دهد و برای پرس و جو و ذخیره نمونه هایی از موجودیت های شما استفاده می شود.
گردش کار پایه
1. مدل خود را تعریف کنید: کلاس های دات نت ایجاد کنید که موجودیت های موجود در پایگاه داده شما را نشان می دهد.
2. ایجاد یک DbContext: کلاسی را تعریف کنید که از DbContext به ارث می برد و شامل ویژگی های DbSet برای هر موجودیت در مدل شما می شود.
3. Configure Your Connection String: نحوه اتصال EF Core به پایگاه داده خود را مشخص کنید.
4. انجام عملیات داده: از context برای پرس و جو، افزودن، به روز رسانی و حذف داده ها استفاده کنید.
مثال:
using Microsoft.EntityFrameworkCore; using System.Collections.Generic; public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;"); } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; } = new List<Post>(); } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }
مفاهیم کلیدی EF Core
1. DbContext:
- به عنوان پلی بین کلاس های موجودیت شما و پایگاه داده عمل می کند.
- برای پرس و جو و ذخیره داده ها استفاده می شود.
- با یک رشته اتصال برای اتصال به پایگاه داده پیکربندی شده است.
2. Entities:
- مدل داده را نشان می دهد. هر موجودیت معمولاً با یک جدول در پایگاه داده مطابقت دارد.
- یک موجودیت کلاسی است که شامل ویژگی های نگاشت شده به ستون های جدول است.
3. DbSet:
- مجموعه ای از موجودیت ها را نشان می دهد. برای پرس و جو و کار با یک نوع موجودیت خاص استفاده می شود.
4. مهاجرت ها:
- راهی برای هماهنگ نگه داشتن طرح واره پایگاه داده با مدل خود با اعمال تغییرات افزایشی در طرح پایگاه داده.
5. پرس و جوهای LINQ:
- زبان یکپارچه پرسش (LINQ) برای بازیابی داده ها از پایگاه داده به روشی رسا و خوانا استفاده می شود.
- به پرس و جوهایی با تایپ قوی اجازه می دهد که در زمان کامپایل بررسی شوند.
مثال تفصیلی
بیایید مثال خود را گسترش دهیم تا برخی از ویژگیهای پیشرفتهتر را شامل شود.
class Program { static void Main() { using (var db = new BloggingContext()) { // Create Console.WriteLine("Inserting a new blog"); db.Add(new Blog { Url = "http://sample.com" }); db.SaveChanges(); // Read Console.WriteLine("Querying for a blog"); var blog = db.Blogs .OrderBy(b => b.BlogId) .First(); // Update Console.WriteLine("Updating the blog and adding a post"); blog.Url = "https://newurl.com"; blog.Posts.Add( new Post { Title = "Hello World", Content = "Welcome to EF Core!" }); db.SaveChanges(); // Delete Console.WriteLine("Delete the blog"); db.Remove(blog); db.SaveChanges(); } } }
ویژگی های پیشرفته
1. Fluent API:
- برای پیکربندی تنظیمات مدل EF Core استفاده می شود.
- کنترل بیشتری بر پیکربندی مدل در مقایسه با data annotation فراهم می کند.
2. Data Annotations:
- ویژگی هایی که می توانید برای پیکربندی مدل به کلاس ها و خصوصیات اعمال کنید.
- شامل حاشیه نویسی مانند [Key]، [Required]، [MaxLength] و غیره.
3. ثبت و تشخیص:
- EF Core قابلیت های گزارش را برای کمک به تشخیص مشکلات و درک عملکرد پرس و جو فراهم می کند.
- با افزودن ارائه دهندگان گزارش (مانند کنسول، اشکال زدایی) می توانید لاگ های سیستم را پیکربندی کنید.
4. مدیریت همزمان:
- EF Core از همزمانی خوشبینانه برای اطمینان از یکپارچگی داده ها در زمانی که چندین کاربر به داده های مشابه دسترسی دارند پشتیبانی می کند.
- شما می توانید نشانه های همزمانی را برای مدیریت تضادها پیکربندی کنید.
5. Lazy Loading:
- بارگیری خودکار داده های مرتبط را هنگام دسترسی به ویژگی های ناوبری فعال می کند.
- با استفاده از بسته Microsoft.EntityFrameworkCore.Proxies می توان آن را فعال کرد.
مثال با Fluent API و Data Annotations
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;"); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Url) .IsRequired() .HasMaxLength(200); modelBuilder.Entity<Post>() .Property(p => p.Title) .IsRequired(); } } public class Blog { public int BlogId { get; set; } [Required] [MaxLength(200)] public string Url { get; set; } public List<Post> Posts { get; } = new List<Post>(); } public class Post { public int PostId { get; set; } [Required] public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }