در این فصل قرار است که در رابطه با تکنولوژی های دسترسی پیدا کردن به دادهها در اپلیکیشنهای Asp.Net Core صحبت کنیم. همانطور که میدانید دسترسی به دادهها اصطلاحاً تحت عنوان Data Access شناخته میشود یک بخش بسیار مهم از هر نرم افزاری به حساب میآیند. فریم ورک Asp.Net Core از گستره وسیعی از گزینههای Data Access از قبیل Entity Framework Core و یا Entity Framework 6 استفاده میکنند. علاوه بر این موضوع شما می توانید از فریم ورک های دیگری که برای Data Access در فریمورک .Net از آنها استفاده می شود نیز استفاده کنید. انتخاب کردن یک فریم ورک برای لحاظ کردن کدهای Data Access بستگی به نیازمندیهای برنامه خواهد داشت. Abstract کردن این گزینه در Application Core و UI و البته پیادهسازی کردن جزئیات مربوطه در پروژه Infrastructure دو مورد بسیار مهم به حساب میآیند. این دو مورد باعث میشوند که پروژه loosely coupled شود و قابلیت تست پذیری بیشتری پیدا کند. در رابطه با اهمیت تست کردن پروژههایی که از Entity Framework Core استفاده میکنند توصیه میکنیم از بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.1 استفاده کنید.
بررسی Entity Framework Core برای بانکهای اطلاعاتی رابطه ای
اگر قرار است که یک پروژه جدید با فریم ورک Asp.Net Core ایجاد کنید و با بانکهای اطلاعاتی رابطه ای کار نمایید، استفاده کردن از فریم ورک Entity Framework Core یک انتخاب بسیار مناسب خواهد بود. در این رابطه توصیه می کنیم از بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.1 نیز دیدن کنید. Entity Framework Core که به طور کوتاه به آن نیز میگویند EF Core نیز گویند یک ORM است شد. یک ORM که مخفف object-relational mapper می باشد اجازه می دهد تا برنامه نویسان دات نت با Object ها کار کرده و سپس آنها را در یک data source ذخیره نموده و یا از آن بازیابی کنند. به عبارت دیگر با استفاده از یک ORM برنامه نویسان در یک فضای کاملاً شیگرا با رکوردهای دیتابیس که در دنیای رابطه ای و یا Relational ذخیره شدهاند کار میکنند و دیگر نیازی ندارند که با جزئیات مربوط به بانکهای اطلاعاتی رابطه ای درگیر بشوند. شبیه به تکنولوژی Asp.Net Core، تکنولوژی EF Core نیز به صورت کامل بازنویسی شده است تا خاصیت هایی از قبیل Modular بودن و cross-platform بودن را در خود داشته باشند. برای استفاده کردن از EF Core شما ابتدا می بایست آن را در قالب یک NuGet package نصب کرده و سپس در کلاس Startup پیکربندی و نهایتاً در صورت تمایل با استفاده از dependency injection از آن استفاده کنید. برای استفاده کردن از EF Core با یک بانک اطلاعاتی رابطه ای SQL Server ابتدا دستور زیر را در dotnet CLI وارد کنید:
[console]
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
[/console]
برای اضافه کردن یک InMemory data source برای تست کردن برنامه می توانید از دستور زیر استفاده نمایید:
dotnet add package Microsoft.EntityFrameworkCore.InMemory
بررسی کلاس DbContext
همانطور که احتمالا می دانید برای کار کردن با Entity Framework Core میبایست یک کلاس ایجاد کنید که از کلاس DbContext ارث بری کند. این کلاس حاوی پروپرتی هایی خواهد بود که نمایانگر کالکشنی از Entity های مربوط به برنامه می باشند. برای مثال برنامه eShopOnWeb شامل یک کلاس به نام CatalogContext است که در آن کالکشن هایی از Entity های مربوط به برنامه وجود دارند. این موضوع در کد زیر نشان داده شده است:
کلاس DbContext تعریف شده توسط شما باید یک تابع سازنده داشته باشد که یک پارامتر ورودی از نوع DbContextOptions را دریافت کرده و سپس آن را به تابع سازنده کلاس DbContext که از آن ارث بری کرده است تحویل بدهد. اگر در برنامه فقط یک کلاس دیگری DbContext دارید میتوانید یک Instance و یا شی از کلاس DbContextOptions را به درون تابع سازنده تحویل بدهی.د اما اگر قرار است که بیش از یک کلاس DbContext تعریف کنید میتوانید از کلاس جنریک DbContextOptions استفاده کرده و کلاس DbContext خاص مورد نظر خود را به عنوان generic parameter مربوط به این کلاس General لحاظ کنید. در رابطه با کار کردن با جنریک ها توصیه می کنیم از بسته ی آموزش ویدئویی جنریک ها (Generics) در دات نت و سی شارپ دیدن کنید.
پیکربندی کردن EF Core
در یک اپلیکیشن Asp.Net Core اغلب پیکربندی های مربوط به Ef Core در متد ConfigureServices اتفاق میافتد. تکنولوژی EF Core از یک کلاس به نام DbContextOptionsBuilder استفاده میکند و با استفاده از extension methods هایی پیکربندی های خود را انجام میدهد. در رابطه با یادگیری extension methods ها می توانید از بسته آموزش ویدئویی متدهای گسترش (Extension Method ها) در سی شارپ دیدن کنید. برای مثال برای پیکربندی کردن کلاس CatalogContext به منظور کار کردن با یک بانک اطلاعاتی SQL Server و البته یک connection string که در Configuration تعریف شده است میبایست از کد زیر در متد ConfigureServices استفاده کنیم.
برای استفاده کردن از یک دیتابیس درون حافظه ای به منظور تست کردن عملکرد نرم افزار نیز میتوانیم از دستور زیر استفاده نماییم.
پس از نصب کردن EF Core و ایجاد کردن کلاس دیگری DbContext و نهایتاً پیکربندی کردن آن در متد ConfigureServices آماده استفاده کردن از EF Core خواهیم بود. برای این کار می توانید یک Instance و یا شی از DbContext مورد نظر را در قالب یک سرویس به هر قسمت برنامه که به آن نیاز دارد تزریق و یا Inject کنید. علاوه بر این موضوع می توانید از بسته ی آموزش ویدئویی Collection ها در سی شارپ استفاده نمایید در این رابطه نیز توصیه می کنیم از بسته ی آموزش ویدئویی LINQ در سی شارپ و بسته ی آموزش ویدئویی مباحث پیشرفته LINQ در سی شارپ دیدن کنید.
تکنولوژی EF Core مراحل ترجمه کردن دستورات LINQ شما به دستورات SQL متناظر برای بازیابی کردن و ذخیره کردن داده ها در بانک اطلاعاتی مورد نظر را انجام خواهد داد. برای اینکه ترجمههای EF Core را ببینید و متوجه بشوید که دستورات نوشته شده با LINQ به چه دستورات متناظر SQL ی تبدیل شده و به سمت دیتابیس ارسال می شوند می توانید از یک logger استفاده کرده و سطح لاگ شدن اطلاعات را حداقل به Information تنظیم کنید. این موضوع در کد زیر نشان داده شده است:
در قسمت بعدی در رابطه با بازیابی کردن و ذخیره کردن داده ها با استفاده از EF Core صحبت خواهیم کرد.