در نوشته های پیشین درباره روش های گوناگون پیاده سازی کلاس های مدل در Entity Framework گفته ایم. نخستین روش آن بود که برای تعریف کلاس مدل یک سری قوانین را باید رعایت می کردیم. برای نمونه هر کلاس باید حتما و حتما یک ویژگی داشته باشد که به ستون کلید اصلی نگاشت داده شود. نام این ویژگی باید یا Id و یا به الگوی ClassNameId مانند EmployeeId باشد. رعایت این قوانین شاید سخت باشد، پس روش دیگر Data Annotation است.

Data Annotation کار طراحی کلاس مدل را بسیار ساده می کند و همچنین شما می توانید با آن قوانین اجباری را کنار گذاشته و با انعطاف و دست بازتر کلاس مدل را طراحی کنید. برای نمونه با استفاده از دو ویژگی به نام های Key و Foreign Key می توانید به ترتیب کلیدهای اصلی و خارجی را مشخص کنید. مزیت دیگر Data Annotation با فرم های اچ تی ام ال در فایل های نما در پروژه های ASP.NET MVC و ASP.NET Core MVC است. برای نمونه اگر ویژگی Required را برای ویژگی های کلاس مدل به کار ببریم بدین معنی است که در فرم اچ تی ام ال، حتما باید برای این ویژگی مقداری وارد شود تا سپس به کمک Entity Framework این مقدار به پایگاه داده فرستاده شود.

Fluent API

یکی دیگر از شیوه ها برای ساخت کلاس های مدل در رویکرد Code First به کارگیری Fluent API ها است. Data Annotation نسبت به Fluent API ویژگی های کمتری دارد و تنها بخشی از کاربردها و ویژگی Fluent API را پیاده سازی کرده است و از این رو سناریوهایی برای نگاشت هست که Data Annotation آنها را پشتیبانی نمی کند.

پیاده سازی و استفاده از Fluent API بسیار ساده است. نخست باید در کلاس Context (یا همان کلاسی که از کلاس پایه DbContext مشتق می شود) یک Override از متدی به نام OnModelCreating بسازید. این متد عضوی از کلاس DbContext است. توجه کنید در نوشته های پیشین نشان دادیم که درون کلاس Context یک سری از ویژگی ها به گونه <DbSet<Entity نیز تعریف می شوند.

سپس باید درون متد OnModelCreating یک سری از متدها را زنجیروار و به دنبال هم فراخوانی کنیم تا بتوانیم با Fluent API ساختار جدول را به کلاس مدل بشناسانیم تا سپس این کلاس مدل و ساختار تعریف شده به جدول پایگاه داده نگاشت داده شوند. توجه کنید هر آن چیزی که با Fluent API می توانیم انجام دهیم با Data Annotation نیز شدنی است ولی عکس آن درست نیست.

کد زیر الگویی از فایل کلاس Context به نام DataContext را نشان می دهد. درون آن یک ویژگی به گونه <DbSet<Employee تعریف شده است. همچنین متد ()OnModelCreating نیز Override شده است. این متد یک پارامتر ورودی از نوع کلاس DbModelBuilder را دریافت می کند و سپس درون بدنه متد، متدهایی از کلاس DbModelBuilder را زنجیروار فراخوانی می کنیم. منظور از زنجیروار این است که به کمک شی (در اینجا پارامتر ورودی متد) و پشت سر هم و با نقطه، هر متد پس از دیگری فراخوانی می شود.

به کمک Fluenet API می توانیم پیکربندی ها را برای تعیین اسکیما پیش فرض، برای تعیین رابطه هایی مانند یک به چند و چند به چند، برای اندیس گذاری، تعیین نام جدول و ستون و همچنین برای تعیین پیکربندی های سطح ستون مانند نوع داده، نوع داده، کلید خارجی و اصلی بودن و NULL بودن استفاده کنیم.

تعیین اسکمیا پیش فرض با متد ()HasDefaultSchema

در مفاهیم پایگاه داده رابطه ای یک اسکیما گروه بندی منطقی از اشیا پایگاه داده است که همه این اشیا به یک کاربر تعلق دارند. اسکیما پیش فرض در SQL Server برابر با Admin است. هم به کمک Data Annotation و هم به کمک Fluent API می توانیم اسکمیا پیش فرض برای جدولی را مشخص کنیم که کلاس مدل برای آن تعریف شده است. در کد زیر مشخص کرده ایم که اسکمیا برای نگهداری جدول های نگاشت داده شده از کلاس های مدل درون اسکیما به نام sales نگهداری شوند.  توجه کنید کد زیر باید درون بدنه متد ()OnModelCreate باشد و همچنین می بینید تعیین اسکیما پیش فرض با متد ()HasDefaultSchema از کلاس ModelBuilder انجام شده است. شکل زیر برخی از متدهای ModelBuilder را نشان می دهد.