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

لایه بالای پایگاه داده، لایه ای است به نام Entity Data Model که به صورت کوتاه شده، EDM نامیده می شود. خود این لایه از سه زیر لایه به نام های Conceptual Model (لایه مدل مفهومی)، Mapping Layer (لایه نگاشت) و Logical Model (لایه مدل منطقی) تشکیل شده است. EDM لایه مرکزی و هسته اصلی در Entity Framework است. در محیط Dot Net توسط فرمان EDMGen.exe یا توسط ابزار ویژوال EDM Designer می توانیم EDM را طراحی کنیم. اگر به شکل بالا دقت کنید، می بینید که هر کدام از سه زیر لایه EDM توسط یک زبان متفاوت و در فایلی با پسوند متفاوت ایجاد می شوند. بنابراین با استفاده از EDM Designer می توانیم هر سه این فایل ها را به صورت خودکار ایجاد کنیم.

ابزار ویژوال EDM Designer برای Dot Net Core و به طبع برای Entity Framework Core وجود ندارد. در مطلب های پیش رو به در مورد EDM Designer صحبت شده است.

لایه مدل منطقی پایین تر EDM و نزدیکترین لایه به لایه پایگاه داده است که در آن اسکیما پایگاه داده هدف تعریف و نمایش داده می شود. لایه منطقی برای نمایش پایگاه داده هدف از زبان ویژه ای به نام SSDL استفاده می کند و از این رو فایل آن دارای ssdl پسوند است. همانطور که گفتیم اسکیما شامل شی های پایگاه داده مانند جدول ها، ستون آنها، نماها، روال های ذخیره شده (Stored Procedures) و توابع می باشد.

بالاترین لایه، لایه مدل مفهومی است که موجودیت ها و رابطه های (Relationship) میان آنها را تعریف می کند. لایه مدل مفهومی از زبان ویژه ای به نام CSDL استفاده می کند که دارای فرمت XML است و همچنین پسوند فایل آن csdl است. در پایان لایه میانی، لایه نگاشت است که وظیفه آن نگاشت میان دو لایه مدل مفهومی و مدل منطقی است. فایل مربوط به این لایه دارای پسوند msl است. همانطور که گفتیم در مدل مفهومی موجودیت ها و رابطه میان آنها مدل می شود و در مدل منطقی پایگاه داده هدف مدل شده است، پس برای ارتباط میان این دولایه، نیاز به لایه میانی است.

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

در مطلب های پیش رو نشان داده ایم که اگر از EDM Designer استفاده کند، یک فایل با پسوند edmx ایجاد می شود که شامل سه زیر فایل با پسوندهای csdl و ssdl و msl است.

لایه مدل منطقی را، لایه مدل ذخیره سازی (Storage Model) نیز می نامند زیرا پایگاه داده که محل ذخیره سازی داده ها است را مدل و تعریف می کند.

همانطور که گفتیم EDM هسته اصلی در Entity Framework است و از این رو Entity Framework از EDM برای انجام عملیات چهارگانه CRUD (یا Create – Read – Update –Delete) استفاده می کند. Entity Framework از EDM  استفاده می کند تا بتواند پرس و جوهای (کوئری های) SQL را از پرس و جوهای LINQ ایجاد کند تا فرمان SQL بدست آمده را به پایگاه داده هدف بفرستد. سپس پاسخ (رکوردهای جدول) را از پایگاه داده دریافت و آنها را به شی ها و الگوی قابل استفاده از زبان برنامه نویسی سی شارپ تبدیل می کند. به عبارت بهتر، بخشی از معماری Entity Framework مسئول تبدیل کوئری های LINQ to Entity به کوئری های زبان SQL و بلعکس، تبدیل رکودهای بدست آمده به شی های Entity است.

مفهوم و کاربرد ADO.NET Data Provider در Entity Framework

Entity Framework برای انجام کارکرد خود باید بتوانید با پایگاه داده هدف ارتباط برقرار کنید، برای این منظور از فراهم کننده های داده (Data Provider) در ADO.NET استفاده می کند. در واقع Entity Framework از فراهم کننده های داده برای ارتباط با پایگاه داده و اجرای فرمان های SQL و دریافت پاسخ از سوی پایگاه داده استفاده می کند.

فضای نام System.Data.SqlClient کلاس هایی را برای ارتباط با پایگاه داده SQL Server و اجرای دستورهای برای آن استفاده می شود. Dot Net دارای فراهم کننده های داده دیگری است که هر کدام در فضای نام متفاوت قرار دارند. به طور مثال فضای نام System.Data.OleDb برای انجام‌ پذیری و آسان ‌سازی دسترسی یکنواخت به داده ‌های متنوع در مخازن و پایگاه‌ های متفاوت داده ‌ها طراحی شده است. (ویکی پدیا فارسی)

هر کدام از فضاهای نام دارای یک سری از شی ها (کلاس های) مهم و کاربردی برای ارتباط با پایگاه داده و اجرای فرمان ها هستند. به طور مثال کلاس DbConnection (و قاعدتا تابع سازنده) آن برای ارتباط با پایگاه داده هدف است. برای ارتباط باید یک رشته اتصال را تعیین کنیم که شامل تمامی موارد و مولفه هایی است که برای ارتباط با پایگاه داده هدف لازم است. DbCommand نام کلاسی است که یک دستور را در پایگاه داده هدف اجرا می کند. این کلاس ها به صورت استاندارد در تمامی فضاهای نام مربوط به فراهم کننده های داده وجود دارند ولی هر کدام مسئول پایگاه داده هدف خودش است.

مفهوم و کاربرد EntityClient Provider در Entity Framework

EntityClient Provider  یک فراهم کننده داده است که توسط Entity Framework برای دسترسی به داده های توصیف شده در لایه مدل مفهومی استفاده می شود. Entity Client یک موتور اجرای پرس و جوهای (کوئری های) سمت کلاینت است که این توانایی را فراهم می کند تا بتوانیم پرس و جوها را برای لایه مدل مفهومی اجرا کنیم.  Entity Client از فراهم کننده های دیگری مانند SqlClient for the Entity Framework برای دسترسی به پایگاه داده هدف (در اینجا Sql Server) استفاده می کند. Entity Client در فضای نام System.Data.EntityClient تعریف شده است.

فراهم کننده های ADO.NET  برای ارتباط و اجرای دستورها با خود پایگاه داده فیزیکی را بر عهده دارند ولی EntityClient مسئول تبدیل پرس و جو های سمت کلاینت (LINQ to Entity یا Entity SQL) به پرس و جوهای زبان SQL است. به عبارت دیگر EntityClient با لایه ADO.NET Data Provider در ارتباط است.

Entity SQL یک زبان شبه SQL است که درون Entity Framework 6 اجازه می دهد تا بتوانیم پرس و جوهایی را بر روی لایه مدل مفهومی انجام دهیم. مدل مفهومی داده ها را به صورت موجودیت ها(Entities) و رابطه (Relationships) میان آنها نشان می دهد و Entity SQL اجازه می دهد تا به عنوان برنامه نویس بتوانیم پرس و جوها را بر روی این موجویت ها و رابطه میان آنها انجام دهیم.

بنابراین وظیفه EntityClient تبدیل این شبه SQL ها به SQL هایی است که باید به لایه ADO.NET Data Provider فرستاده شود، تا در نهایت به پایگاه داده هدف فرستاده و پاسخ آن دریافت شود. EntityClient برای این منظور و ارتباط با ADO.NET Data Provider از فراهم کننده های داده دیگری استفاده می کند. در واقع می توانیم بگوییم که EntityClient یک فراهم کننده داده مستقل از پایگاه داده هدف است، به طوری که کلاس هایی مانند EntityConnection و EntityCommand و EntityDataReader را فراهم کرده است.

در این مطلب تلاش کردیم تا معماری و برخی از مفاهیم پایه ای Entity Framework مانند، EDM و سه زیر لایه آن، فراهم کننده داده ADO.NET و کاربرد آن برای تعامل با پایگاه داده هدف، EntityClient و کاربرد آن برای تبدیل فرمان های شبه SQL  مربوط به LINQ to Entity و Entity SQL به دستورهای زبان SQL و استفاده از فراهم کننده های Entity Framework برای تعامل با ADO.NET Data Provider را آموزش دهیم. در مطلب های پیش رو جنبه های دیگری از مفاهیم Entity Framework آموزش داده شده است. توجه کنید نمی توانیم مفاهیم را تنها در یک یا دو مطلب آموزش دهیم، بلکه در مطلب های متفاوت به مفاهیم خواهیم پرداخت.