در دوره Entity Framework درباره چگونگی ارتباط با پایگاه داده توسط Entity Framework 6 صحبت کرده ایم و تلاش شده مفاهیم مربوط را آموزش دهیم. از این نوشته به بعد و در چندین نوشته می خواهم درباره Entity Framework Core 3 برای ارتباط به پایگاه داده MySQL در پروژه های ASP.NET Core صحبت کنیم. در این نوشته می خواهیم درباره فهرست زیر بخوانیم:

  • ساخت کلاس مدل با Data Annotation
  • ساخت کلاس DbContext
  • فرستادن نخستین خروجی کوئری LINQ به فایل نما

ساخت کلاس مدل

در نوشته های پیشین کلاس مدل به نام Employee را ساخته بودیم که دارای ویژگی هایی به نام Id و FName و LName و Age بود که در اینجا می خواهم آن را با تغییر نام دادن دو ویژگی FName و LName به FirstName و LastName و استفاده از Data Annotation بازنوسی کنم. بنابراین برای یادگیری کدهای زیر نیاز است مفاهیم زیر را از پیش بخوانید.

Data Annotation در Entity Framework – بخش یکم

Data Annotation در Entity Framework – بخش دوم

Data Annotation در Entity Framework – بخش سوم

در کد بالا به کمک ویژگی Table و بالای نام کلاس Employee آشکارا نام جدول نهایی را employee گذاشته ایم. بر پایه مفاهیم Entity Framework نام کلاس مدل به نام جدول نگاشت داده می شود. سپس بالای هر یک از ویژگی های کلاس دیگر عبارت های Data Annotation را نوشته ایم. عبارت Key ویژگی را به ستون کلید اصلی نگاشت می دهد. عبارت Column نام ستون را مشخص می کند. برای درک بهتر باید نوشته های دوره Entity Framework را بخوانید. عبارت Required برای این استفاده می شود تا در فرم اگر فیلد مربوط به ویژگی خالی رها شود، خطایی نشان داده شود که این پیغام خطا برابر با رشته ای است که به ErrorMessage فرستاده ایم.

برای ویژگی emp_hire_date مقدار برگشتی از DateTime.Now به عنوان مقدار پیش فرض در نظر گرفته شده است. همانگونه در MySQL این برابر این است که مقدار پیش فرض برابر با (CURRENT_TIMESTAMP(6 باشد. پس از آنکه کلاس مدل را طراجی کردیم، نوبت به آن است که کلاس Context و رشته اتصال را آماده کنیم.

تعریف کلاس Context

در نوشته ایجاد مدل و مفهوم و کاربرد DbContext در Entity Framework درباره کلاس DbContext گفته ام. در Entity Framework Core نیز در این کلاس ویژگی هایی <DbSet<Entity تعریف می شوند که در آن به جای Entity نام یک مدل قرار می گیرد که در اینجا به جای آن Employee نوشته می شود. بنابراین با ویژگی <DbSet<Employee می توانیم از طریق نمونه کلاس DbContext به جدول employee در پایگاه داده دسترسی داشته باشیم.

در کد زیر کلاس DataContext از کلاس پایه DbContext به ارث برده شده است. کلاس DbContext برای Entity Framework Core در فضای نام Microsoft.EntityFrameworkCore است. متدی از کلاس DbContext به نام OnConfiguring در آغاز Override شده است. در مفاهیم شی گرایی می توانیم به ویژگی ها و متدهای کلاس پایه درون کلاس های فرزند دسترسی داشته باشیم. همانگونه که می بینید تعریف این متد به صورت protected override void است و تنها یک ورودی به نام optionsBuilder از کلاس DbContextOptionsBuilder دریافت می کتد.

سپس درون متد Override شده OnConfiguring باید به کمک پارامتر optionsBuilder به متد ()UseMySQL از کلاس DbContextOptionsBuilder دسترسی پیدا کنیم. همانگونه که می بینید رشته اتصال به آن فرستاده شده است. در این رشته اتصال هر بخش با سمی کالن ; از دیگری جدا شده است و هر بخش نیز یک دوتایی Key=Value است. server آدرس یا نام سرور پایگاه داده MySQL را مشخص می کند. database نام پایگاه داده ای را مشخص می کند که قرار است جدول در آن ساخته شود. uid نام کاربری که با آن به سرور متصل می شویم و password گذرواژه را مشخص می کند.

انجام مهاجرت از کدهای سی شارپ به جدول پایگاه داده

در مفاهیم Entity Framework Core هر کلاس مدل به یک جدول و هر ویژگی کلاس مدل به یک ستون و هر نوع ویژگی به یکی از نوع های SQL نگاشت داده می شود و همه اینها بدست Entity Framework Core انجام می شود. برای انجام مهاجرت باید دستورهایی که در نوشته بخش یکم گفتیم را اجرا کنیم که در زیر دوباره آنها فهرست شده اند. شکل های زیر خروجی این دو دستور را نشان می دهند.

معماری Entity Framework

مفاهیم و واژگان Entity Framework

بنابراین پیش از هر چیز در MySQL باید یک پایگاه داده با دستور CREATE DATABASE بسازیم که من آن را aspcore نامگذاری کرده ام. در شکل زیر در مقدار برگشتی SHOW DATABASES نام این پایگاه داده نشان داده می شود. سپس دستور USE aspcore را اجرا کرده ام و در دنباله دستور SHOW TABLES را اجرا کرده که می توانید نام پایگاه داده employee را ببینید.

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

در نوشته های دوره Entity Framework درباره زبان پرس و جوی شبه SQL به نام LINQ در سی شارپ گفته شده است. در این نوشته می خواهیم تعداد همه سطرهای جدول employee را پیدا کنیم. در زیر درون متد ()Index از کلاس کنترل گر Employee و درون عبارت ()using یک نمونه از کلاس DataContext ساخته ایم که این کلاس Context است. سپس دستور ()var employees = context.Employees.ToList را انجام داده ایم که به کمک context.Employees نخست همه سطرهای جدول Employee از پایگاه داده واکشی می شود. سپس این فهرست برگشتی به یک List تبدیل خواهد شد. این لیست درون متغیری متغیری به نام employees ریخته می شود و سپس این متغیر برای فرستاده شدن به فایل نما، به تابع ()View فرستاده می شود.

در اینجا می خواهیم تعداد داده های از کلاس مدل Employee یا بهتر است بگوییم از جدول employee را در فایل نمایی به نام Index.cshtml در زیر مسیر Views/Employee که در متغیر employees نگهداری می شوند. در کد زیر از فایل نما نخست به کمک عبارت model@ کلاس مدل Employee را پیوست کرده ایم و سپس در خط ۱۳ و به کمک عبارت Model@ (با M بزرگ) و سپس به کمک متد ()Count تعداد عصنرهای درون متغیر employees همگی نمونه هایی از کلاس Employee هستند را بدست آورده ایم. شکل عدد صفر را پیش روی Number of Employees نشان می دهد، زیرا هنوز هیچ سطری در جدول نداریم.

اکنون و برای تست برنامه می توانیم به صورت دستی و با دستو INSER چهار یا هر چندتای دیگر سطر را به جدول درج کنیم. در دستورهای زیر اولا ستون emp_id در حدول، کلید اصلی است زیا عبارت Key از Data Annotation بالای ویژگی Id از کلاس Employee نوشته شده است و چون پیش فرض AUTO_INCREMENT است، پس نیازی نیست آنرا مقدار دهی کنیم چون خودش یکی یکی افزایش پیدا می کند. همچنین چون برای ویژگی HireDate مقداری پیش فرض، یعنی DateTime.Now تعیین شده است، پس ستون معادل آن یعنی emp_hire_date نیز دارای مقدار پیش فرض است و می توانیم برای آن در زمان درج مقدار تعیین نکنیم.

اکنون اگر دوباره پروژه را اجرا کنیم همانند شکل زیر باید شما ۴ پیش رو Number of Employees نمایش داده شود. بنابراین از دید SQL ما نخست دستور SELECT * FROM employee را انجام داده ایم و سپس یک لیست ساخته ایم و آن لیست را به فایل نما فرستاده ایم و در آنجا  تعداد عنصرهای درون آن را به ()Model.Count بدست آوردیم. در واقع با model@ یک فایل نما به شدت وابسته به مدل ساخته ایم و سپس با Model@ به نمونه هایی از کلاس Employee که به کمک متغیر employees به فایل نما فرستاده شده بود دسترسی پیدا کرده ایم.

مفهوم نما مدل به شدت وابسته به نوع ASP.NET Core MVC

نمایش داده های یک مدل در نما ASP.NET Core MVC