دوره آموزشی Entity FrameWork Core - مقدمه

خوب Entity Framework (EF) Core یک نسخه سبک(lightweight)، قابل توسعه(extensible)، منبع باز(open source) و چند پلتفرمی(cross-platform) از فناوری محبوب دسترسی به داده دات نت است.در واقع EF Core می‌تواند به‌عنوان یک ORM یا object-relational mapper عمل کند به این معنا که:توسعه دهندگان دات نت را قادر می سازد تا با استفاده از اشیاء دات نت(NET objects.) با پایگاه داده کار کنند.نیاز به اکثر کدهای دسترسی به داده را که معمولاً نیاز به نوشتن دارند، از بین می برد.همچنین EF Core از بسیاری موتورهای پایگاه داده(database engines) پشتیبانی می کند.به این معنی که Entity Framework Core می‌تواند از طریق کتابخانه‌های افزونه‌ای(plug-in libraries) که ارائه‌دهنده پایگاه داده(database providers) یا در برخی موارد provider plugin API نیز نامیده می‌شوند، به پایگاه‌های داده مختلف دسترسی داشته باشد.ایجاد یک پروژه جدید : ویژوال استودیو را باز کنیدروی Create a new project کلیک کنیدنوع پروژه مدنظر خود بر فرض Asp.Net Core Web APP را با تگ #C انتخاب کنید و روی Next کلیک کنیدبرای نام EFGetStarted را وارد کرده و روی Create کلیک کنیدنصب Entity Framework Core : اکثر database providerها برای EF Core به صورت NuGet packages توزیع می شوند و می توان به چند صورت package های مورد نظر را دانلود و نصب نمود از طریق Visual Studio NuGet Package Manager Console : Tools > NuGet Package Manager > Package Manager Console Install-Package Microsoft.EntityFrameworkCore.SqlServerاز طریق Visual Studio NuGet Package Manager DialogProject > Manage NuGet Packagesدر ادامه کلیک بر روی Tab Browse یا Updatesدر نهایت برای نصب یا به‌روزرسانی SQL Server provider، بسته Microsoft.EntityFrameworkCore.SqlServer را تایپ /انتخاب کرده و تأیید کنید.از طریق NET Core CLI. که در صورت علاقه به عنوان تمرین به شما واگذار می شود.ایجاد Model : در EF Core، دسترسی به داده ها با استفاده از یک Model انجام می شود.یک مدل از entity classeها تشکیل شده است از آنجایی که ما از یک رویکرد code first پیروی می کنیم، بیایید مدل های داده خود را طراحی کنیم. یک پوشه Models اضافه کنید و دو کلاس جدید به نام های Blog و Post با propertyهای زیر ایجاد کنید.public class Blog { public int BlogId { get; set; } public string Url { get; set; } public int Rating { get; set; } public List<Post> Posts { get; set; } } 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; } }ایجاد Context Class و Interface : یک پوشه جدید به نام Context بسازید و یک کلاس به نام ApplicationContext اضافه کنید. این کلاس خاص به ما کمک می کند تا با استفاده از Entity Framework Core ORM به داده ها دسترسی پیدا کنیم.کلاس context class امکان پرس و جو(querying) و ذخیره داده ها را فراهم می کند.public class ApplicationContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options) { } public async Task<int> SaveChangesAsync() { return await base.SaveChangesAsync(); } }نکته - چگونه یک interface را از یک کلاس استخراج کنیم؟اکنون که کلاس را کامل کردیم، اجازه دهید یک راه آسان برای ایجاد یک interface برای هر کلاس مشخص به شما نشان دهم. ویژوال استودیو بسیار قدرتمند از آن چیزی است که ما فکر می کنیم. بنابراین در اینجا نحوه کار به این صورت است.به کلاسی بروید که برای آن به interface نیاز داریم. در اینجا، به کلاس ApplicationContext.cs بروید.کل کلاس را انتخاب کنید.پس از انتخاب، به Edit -> Refactor -> Extract Interface بروید.ویژوال استودیو برای تایید، درخواست خواهد کرد. نام اینترفیسی که باید تولید شود را وارد کنید و بعد Ok.ما interface خود را آماده کرده ایم. تصور کنید وقتی کلاس های نسبتا طولانی داریم، این ویژگی چقدر مفید خواهد بود.خروجی آن به این صورت خواهد بود :public interface IApplicationContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } Task<int> SaveChangesAsync(); }پیکربندی سرویس‌های API برای پشتیبانی از Entity Framework Coreما می توانستیم در همان کلاس ApplicationContext پیکیربندهای لازم برای پشتیبانی از EF Core را به صورت زیر انجام دهیم :protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( @&quotServer=.;Database=SampleDB;Trusted_Connection=True;MultipleActiveResultSets=true&quot); }اما راه حل تمیز و در یک پروژه واقعی آن است که به صورت زیر عمل کنیدبه کلاس Program.cs پروژه API خود بروید. بیایید پشتیبانی از EntityFrameworkCore را اضافه کنیم. فقط این خطوط را اضافه کنید. با این کار EF Core در برنامه Register می شود.builder.Services.AddDbContext<ApplicationContext>(options => { options.UseSqlServer(builder.Configuration.GetConnectionString(&quotDefaultConnection&quot), b => b.MigrationsAssembly(typeof(ApplicationContext).Assembly.FullName)); });خط 3 در مورد رشته اتصال که به عنوان DefaultConnection نامگذاری شده است می گوید. اما ما چنین ارتباطی را تعریف نکرده ایم، بیایید آن را نیز انجام دهیمتعریف رشته اتصال در appsettings.jsonما باید یک منبع داده را به API متصل کنیم. برای این کار، باید یک رشته اتصال در appsettings.json موجود در پروژه API تعریف کنیم.&quotConnectionStrings&quot: { &quotDefaultConnection&quot: &quotServer=.;Database=SampleDB;Trusted_Connection=True;MultipleActiveResultSets=true&quot }, ایجاد DataBase :خوب در ادامه می‌توانید ابزارهایی را برای انجام وظایف مرتبط با EF Core در پروژه خود نصب کنید، مانند ایجاد و اعمال migrations پایگاه داده.پس از ایجاد یک مدل، از EF Migrations برای ایجاد یک پایگاه داده از مدل استفاده کنید. Migration ها امکان تکامل پایگاه داده را با تغییر مدل فراهم می کند.Install-Package Microsoft.EntityFrameworkCore.Toolsبا استفاده از ابزار Package Manager Console (PMC) در ویژوال استودیو دستورات Migration که با یک فعل شروع می شوند، به عنوان مثال Add-Migration، Update-Database. امکان تکامل پایگاه داده را با تغییر مدل فراهم می کند.اکنون مدل های خود و رشته اتصال را آماده کرده ایم، تنها کاری که باید انجام دهیم این است که از مدل های تعریف شده یک پایگاه داده تولید کنیم. برای این کار باید از کنسول Package Manager ویژوال استودیو استفاده کنیم. می‌توانید این را با رفتن بهTools -> Nuget Package Manager -> Package Manager Consoleقبل از ادامه، بیایید بررسی کنیم که آیا مشکلاتی در Build وجود دارد یا خیر. برنامه را یک بار Build کنید تا مطمئن شوید خطایی وجود ندارد، زیرا ممکن است در مراحل بعدی اخطار مناسبی نشان داده نشود.و بعد :add-migration initialupdate-databaseدستور Add-Migration یک Migration را برای ایجاد مجموعه اولیه جداول برای مدل تولید می کند. دستور Update-Database پایگاه داده را ایجاد می کند و Migration جدید را به آن اعمال می کند.پرس و جو (Querying) :نمونه‌هایی از کلاس‌های موجودیت شما با استفاده از Language-Integrated Query یا به اختصار زبان LINQ از پایگاه داده بازیابی می‌شوند.LINQ به شما امکان می دهد از سی شارپ (یا زبان انتخابی دات نت خود) برای نوشتن پرس و جوهای strongly typed استفاده کنید. به این معنی که هر تلاشی برای ارسال یک نوع پارامتر اشتباه به عنوان آرگومان، یا اختصاص مقداری به متغیری که به طور ضمنی قابل تبدیل نیست(implicitly convertible)، یک خطای کامپایل ایجاد می کند. این از بسیاری از خطاهایی که فقط در زمان اجرا رخ می دهد جلوگیری می کند.Loading all datausing (var context = new ApplicationContext ()) { var blogs = context.Blogs.ToList(); }Loading a single entityusing (var context = new ApplicationContext ()) { var blog = context.Blogs .Single(b => b.BlogId == 1); }Filteringusing (var context = new ApplicationContext()) { var blogs = context.Blogs .Where(b => b.Url.Contains(&quotdotnet&quot)) .ToList(); }یک Query عبارتی(expression) است که داده ها را از منبع داده بازیابی می کند.Query ها معمولاً به زبان پرس و جو تخصصی(specialized query language) بیان می شوند.زبان های مختلفی در طول زمان برای انواع مختلف منابع داده(data sources) توسعه یافته اند، به عنوان مثال SQL برای پایگاه های داده رابطه ای و XQuery برای XML. بنابراین، توسعه‌دهندگان مجبورند برای هر نوع منبع داده یا قالب داده‌ای که باید از آن پشتیبانی کنند، یک زبان پرس‌وجو جدید بیاموزند!!!اما LINQ این وضعیت را با ارائه یک مدل سازگار برای کار با داده ها در انواع مختلف منابع داده و فرمت ها ساده می کند.در LINQ query، شما همیشه با اشیا کار می کنید. شما از همان basic coding patterns اولیه برای پرس و جو و تبدیل داده ها درXML documents,SQL databases, ADO.NET Datasets, .NET collections و هر قالب دیگری که ارائه دهنده LINQ برای آن در دسترس است استفاده می کنید.تمام عملیات پرس و جوی LINQ از سه عمل مجزا تشکیل شده است:منبع داده را بدست آورید(Obtain the data source).پرس و جو را ایجاد کنید(Create the query).پرس و جو را اجرا کنید(Execute the query).پرس و جو مشخص می کند که چه اطلاعاتی از منبع داده یا منابع بازیابی شود. به صورت اختیاری، یک پرس و جو همچنین مشخص می کند که چگونه آن اطلاعات باید قبل از بازگرداندن مرتب شوند(sorted)، گروه بندی(grouped) و شکل داده شوند(shaped).ذخیره داده(Saving data) :داده ها با استفاده از نمونه هایی از کلاس های موجودیت شما در پایگاه داده ایجاد، حذف و اصلاح می شوند.//Create using (var db = new ApplicationContext()) { var blog = new Blog { Url = &quothttp://sample.com&quot }; db.Blogs.Add(blog); db.SaveChanges(); }هر context instanceی دارای یک ChangeTracker است که مسئول پیگیری تغییراتی است که باید در پایگاه داده نوشته شوند. همانطور که در نمونه هایی از کلاس های موجودیت خود تغییراتی ایجاد می کنید، این تغییرات در ChangeTracker ثبت می شود و سپس با فراخوانی SaveChanges در پایگاه داده نوشته می شود. database provider مسئول ترجمه تغییرات به عملیات خاص پایگاه داده است (به عنوان مثال، دستورات INSERT، UPDATE و DELETE برای یک پایگاه داده رابطه ای).بیشتر بخوانید : دوره آموزشی Entity FrameWork Core - قسمت اولبیشتر بخوانید : دوره آموزشی Entity FrameWork Coreبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi