در مطلب رویکردهای Entity Framework، کوتاه در مورد سه رویکرد Entity Framework، توضیح دادیم. در این مطلب که به عنوان نخستین گام در برنامه نویسی و شروع کار با Entity Framework است، می خواهیم در مورد رویکرد Code First صحبت کنیم. همانطور که از نام آن مشخص است، در این رویکرد ابتدا باید کدهای برنامه (در اینجا سی شارپ) نوشته شوند. در این رویکرد باید موجویت ها (Entity) بوسیله شی گرایی و کلاس های زبان برنامه نویسی (در اینجا سی شارپ) ایجاد کنیم. به عبارت دیگر در این رویکرد برای ایجاد مدل، در آغاز کدها (کلاس ها) نوشته شده و سپس Entity Framework آنها را به پایگاه داده هدف نگاشت می دهد.

برای شروع و مطابق شکل زیر نخست یک پروژه ساده کنسولی در محیط NET. ایجاد کنید. لزومی ندارد فعلا یک پروژه پیچیده مانند ASP.NET را ایجاد کنید، بلکه در این مطلب و چندین مطلب پیش رو می خواهیم روش انجام چهار عمل CRUD، یعنی ایجاد جدول ها، درج داده ها در جدول، خواندن داده از جدول، بروز رسانی رکوردهای جدول و پاک کردن رکوردهای جدول را آموزش دهیم. سپس باید مطابق شکل دوم زیر و درون پروژه، یک کلاس ایجاد کنیم که این کلاس ساختار یک موجودیت (جدول) را در خود نگه می دارد.

برابر با کد شکل زیر کلاسی به نام User ایجاد کرده ایم که دارای چهار خصوصیت (Property) است که هر یک از این خصوصیت ها در واقع یکی از ستون های جدولی خواهند بود که می خواهیم درون پایگاه داده ایجاد کنیم. نام جدولی که درون پایگاه داده ایجاد می شود، همنام با نام کلاس ها خواهد بود. همچنین نوع خصوصیت های کلاس توسط Entity Framework به نوع معادل آنها در پایگاه داده هدف نگاشت (Map) داده می شوند.

بنابراین تا به اینجا با چندین قاعده درون Entity Framework آشنا شدیم که آنها را به همراه برخی دیگر از قاعده ها در ادامه فهرست کرده ایم. همچنین در طول دوره و در مطلب های پیش رو قاعده های دیگری نیز آموزش داده شده اند. رعایت نکردن برخی از این قواعد باعث بروز استثنا در زمان اجرای برنامه می شود.

قاعده ۱ – نام کلاس به نام جدول نگاشت داده می شود. همچنین نام کلاس به صورت منفرد است.

قاعده ۲ – نام خصوصیت های کلاس به ستون های جدول نگاشت داده می شود.

قاعده ۳ – نوع خصوصیت های کلاس به نوع معادل آنها در پایگاه داده هدف نگاشت داده می شود. به طور مثال نوع int در سی شارپ به نوع intو یا نوع string به نوع vchar در SQL Server نگاشت داده می شود.

قاعده ۴ – در کلاس حتما باید یک خصوصیت به نام Id وجود داشته باشد، زیرا Entity Framework  آن را به کلید اصلی (Primary Key) در جدول نگاشت داده می شود. همچنین شما می توانید از الگوی Class_NameId استفاده کنید. به طور نمونه کلاس شکل بالا User است، پس اگر خصوصیت UserId وجود داشته باشد.

پس از ایجاد کلاس موجودیت (Entity Class) که در بالا توضیح دادیم، باید کلاس Context را ایجاد کنیم. همانطور که گفتیم کلاس Context، کلاسی است که از کلاس پایه DbContext مشتق شده است. در شکل زیر کلاس Context ایجاد شده است ولی می بینید که خطایی در برنامه وجود دارد. به عبارت دیگر کلاس های DbContext و DbSet وجود ندارند.

همچنین توجه کنید که کلاس ها در فضای نام System.Data.Entity وجو دارند، پس حتما باید آنرا ضمیمه کرده باشید. در مطلب های پیشین که در مورد ADO.NET صحبت کردیم، گفتیم باید برای کار با پایگاه داده مورد نظر، فراهم کننده داده آن را به برنامه ضمیمه کنیم. به طور نمونه اگر می خواهیم با SQL Server کار کنیم، پس باید فضای نام System.Data.SqlClient را به برنامه ضممیه کنیم. ولی در Entity Framework دیگر نیازی به ضمیمه کردن فضای نام فراهم کننده داده (Data Provider) نیست، زیرا Entity Framework به عنوان یک ORM باید لایه ای میان برنامه و تمامی پایگاه داده های رابطه ای باشد و دیگر برنامه نویس نباید نگران نوشتن کدهای SQL برای پایگاه داده هدف باشد، بلکه Entity Framework چگونگی تعامل با پایگاه داده های متفاوت را از دید برنامه نویس پنهان می کند.

قاعده ۵ – نام کلاس Context به صورت الگوی StringContext  است که می توانید هر رشته ای را پیش از واژه Context قرار دهید. همچنین کلاس Context از کلاس  DbContext مشتق می شود، پس الگو آن به صورت StringContext : DbContext است.

نصب 6 Entity Framework

دلیل خطا و عدم وجود کلاس ها، عدم نصب Entity Framework درون پروژه است. بنابراین برای رفع مشکل بالا، باید مطابق شکل های زیر Entity Framework را نصب کنید. پس ابتدا روی پروژه راست کلیک کرده و سپس Manage NuGet Packages را انتخاب کنید تا شکل بعدی نشان داده شود. در بخش Installed اگر عبارت Entity Framework را جستجو کنید، چیزی برگشت داده نمی شود، پس باید به بخش Browse  بروید و عبارت Entity Framework را وارد کنید و سپس روی Install کلیک کنید.

پس کلیک روی نصب به ترتیب شکل های زیر نشان داده می شوند که باید در پنجره Preview Change آخرین تغییرات درون Entity Framework نشان داده شده است. OK را کلیک کرده تا پنجره License Acceptance نشان داده شود که باید Accept را کلیک کنید. در نهایت در شکل آخر، ویژوال استادیو از شما اجازه نوشتن تمامی تغییرات را می کند که باید Yes to All را کلیک کنید.

حال به فایل UserContext که حاوی کلاس Context است برگردید و خواهید دید که مشکل عدم شناسایی کلاس برطرف شده است. همچنین در شکل زیر می بینید که خصوصیت DbSet با کلاس موجودیت User به درون کلاس Context افزوده شده است.

قاعده ۶ – نام خصوصیت نوع DbSet به صورت جمع است، پس می بینید که نام خصوصیت Users است.

به عنوان گام پایانی در برنامه نویسی، می خواهیم در اینجا دو رکورد را به جدول ها اضافه کنیم، پس مطابق شکل زیر فایل Program.cs (در تمامی پروژه های NET Framework) را ویرایش کرده ایم. درون متد ()Main دو نمونه از کلاس User ایجاد شده است.

سپس با استفاده از عبارت using، درون آن یک نمونه از کلاس UserContext ایجاد کرده ایم. سپس درون بدنه عبارت using، متد ()Add از متدهای DbContext، فراخوانی شده است. توجه کنید Users نام خصوصیت از نوع DbSet در کلاس Context (اینجا کلاس UserContext) است. در نهایت تمامی تغییرات توسط متد ()SaveChanges از کلاس DbContext برای تثب تغییرات، فراخوانی شده است.

در مطلب های پیش رو متدهای دیگری از DbContext مانند ()AddRange و ()Remove معرفی شده اند.

توجه کنید که لزومی ندارد که در ابتدای ایجاد کلاس های موجودیت، حتما رکوردهایی را درج کنیم، بلکه Entity Framework و DbContex ابتدا جدول ها را ایجاد می کند و سپس می توانیم از طریق ایجاد شی از کلاس Context و سپس توسط متد ()Add، رکوردهایی را به آن اضافه کنیم. الگوی اضافه شده رکورد برای یک موجودیت، به صورت زیر است.

گام های بالا چگونگی برنامه نویسی برای رویکرد Code First را نشان می دهد، ولی یک مشکل در گام های بالا وجود دارد و آن عدم وجود یک پایگاه داده برای ایجاد و ذخیره سازی جدول ها است. بنابراین مطابق شکل زیر می توانیم یک LocalDB را ایجاد کنیم. در اینجا پایگاه داده را Database نامیده ایم ولی شما می توانید نام دیگری را انتخاب کنید.

مطابق با مطلب ایجاد LocalDB در ویژوال استادیو، یک فایل به نام Database.mdf ایجاد می شود و برای اتصال به پایگاه داده باید روی آن دو بار کلیک کنید تا در سمت دیگر و در پنل – پایگاه داده آغاز (Start) شود. حال باید رشته اتصال را در فایل App.config ایجاد کنیم. کد شکل زیر چگونگی تعریف رشته اتصال را درون فایل App.config و در بخش connectionSection را نشان می دهد. درون بخش connectionSection، از Add استفاده شده است که درون آن مقدار پارامتر name برابر با نام کلاس Context است که در این مطلب UserContext نام دارد. پارامتر connectionString رشته اتصال را مشخص می کند. در نهایت پارامتر Provider فضای نام فراهم کننده داده برای اتصال به پایگاه داده هدف را مشخص می کند. چون می خواهیم از SQL Server LocalDB  استفاده کنیم، پس باید فضای نام System.Data.SqlClient را به پارامتر Provider انتساب دهیم.

ایجاد SQL Server LocalDB در ویژوال استادیو ۲۰۱۷


قاعده ۷ – اگر کد فایل Program.cs را نگاه کنید، می بینید که برای خصوصیت Id در دو نمونه user1 و user2 به ترتیب مقدارهای  1000 و 1001 نوشته شده است ولی در شکل بالا مقدار ستون Id به ترتیب برابر با عددهای 1  و 2 است. دلیل آن اینکه Entity Framework با توجه به رفتار SQL Server کلید اصلی را با عبارت AUTO_INCREMENT ایجاد می کند و از مقدار تعیین شده برنامه نویس صرف نظر خواهد کرد.

جمع بندی

در این مطلب تلاش کردیم تا چگونگی ایجاد کلاس موجودیت که هر کدام نشان دهنده تعریف یک جدول درون پایگاه داده رابطه ای هستند. نام کلاس به صورت پیش فرض و قاعده به عنوان نام جدول و نام خصوصیت های آن به عنوان نام ستون های جدول نگاشت داده می شوند. نوع خصوصیت های کلاس نیز به نوع های درون پایگاه داده نگاشت داده می شوند. برای تعامل با پایگاه داده با کلاسی مشتق شده از کلاس پایه DbContext باید باید ایجاد کنیم که اصطلاحا آنرا کلاس Context می نامیم.

سپس بوسیله متد ()Add از متدهای DbContext می توانیم نمونه ای از کلاس موجودیت ( در این مطلب متغیرهای user1 و user2 نمونه های کلاس User) را عنوان تغییرات معرفی کنیم تا سپس این تغییرات بوسیله متد ()SaveChanges به پایگاه داده و جدول مربوطه اعمال شوند. توجه کنید در دستور زیر context نمونه ای از کلاس Context است که در این مطلب UserContext نام دارد. Users خصوصیت DbSet است که در کلاس Context ایجاد کرده بودیم.