نگاهی عمیق تر به Entity Data model
ابتدا از محیط کاری و پنجره های طراحی EDM صحبت می کنیم . در کار با EDM 4 پنجره از محیط طراحی برای شما بسیار مفید است
1-Designer surface : سطح بصری طراحی می باشد که شما می توانید به کمک آن ساختار و مدل EDM را ایجاد و یا تغییر دهید.
2-Mapping Detail windows : پنجره ای برای map کردن و تغییر در این پنجره شما یک ساختار فیزیکی از عناصر Entity را مشاهده می کنید
3-Toolbox : جعبه ابزار که برای همه مشخص است و در مقاله قبل با آن بیشتر آشنا شدیم
4-Model Browser Window : این پنجره ساختاری درختی از مدل مفهومی و منطقی مدل نمایش می دهد .
در شکل زیر این چهار پنجره به تفکیک نمایش داده شده است ..
Entities
برای فهم بهتر entity باید با چند مفهوم آشنا شویم
Entity Type : نشان دهنده نوع خاصی از داده ها است مثلا داده ای از نوع سطرهای جدول کارمند Emplyee ، در واقع می توان گفت رکوردهای جدول را نشان می دهند..
Entity Set : یک در برگیرنده یا مجموعه ای از Entity های واحد .بنابر این Entity ها را می توان بصورت Entity Set گروه بندی کرد .در هر Entity set ما می توانیم چند Entity type داشته باشیم و هر گروه Entity Set نیز می تواند با یک Entity Set دیگر در ارتباط باشد .
فرض کنیدما 3 نوع Entity Type به نامهای Salesperson ,SalesOrderHeader,SalesOrderDetail داریم و دو تا Entity Set داریم که به صورت شکل زیر هستند
دراینجا Entity Set اول شامل دوتا Entity Type است .
Scalar Properties : اگر مقاله های قبلی را مطالعه کرده باشید متوجه شدید که هر Entity Type دارای مجموعه ای از خصوصیات (Properties ) می باشد که یکی از آنها Scalar Properties است . اگر بخواهیم آن را به زبان ساده بیان کنیم باید بگویم که این آیتم در واقع خصوصیتهایی را تعریف می کند که مقادیر رایج متغیرها یعنی عدد ، رشته ، کارکتر و تاریخ و غیره را می پذیرد .به تعبیری دیگر همان فیلدها بانک اطلاعاتی هستند که هر کدام دارای نوع هستند اگر شما یک Entity Type از مثالهای قبل ایجاد کرده باشید کافیست یکی از خصوصیات را انتخاب کنید و به پنجره Properties دقت کنید
می بینید هر کدام از فیلدها یا همان خصوصیتهای Entity ما دارای ویژگیهایی است مانند زیر
Name : نام خصوصیت مورد نظر را نمایش می دهد که می توان آن را تغییر داد
Nullable : آیا فیلد مشخص شده مقدار Null را می پذیرید
Setter : همان خاصیت Set در تعریف خصوصیات کلاسها که ما در اینجا سطح دسترسی آن را تعریف می کنیم
Getter : همان خاصیت Get در تعریف خصوصیت فیلد کلاسها که ما در اینجا سطح دسترسی آن را تعریف می کنیم
StoredGenerationPattern : معادل Auto –generated در بانکهای اطلاعاتی یعنی مقادیر یک فیلد اتوماتیک اضافه می شوند
Type : نوع فید
Default Value: مقدار پیش فرض
Complex Types
حتما تا کنون با ساختارها (structure) سروکار داشته اید . ما ساختاری تعریف می کردیم که می توانست مجموعه ای از داده های متفاوت را با هم در یک متغیر ساختاری جمع آوری می کرد . مفهموم Complex Types چیزی شبیه به همان مغیرهای ساختاری است . در وواقع یک متغیر مرکب است .مثلا اگر بخواهید آدرس فردی را با ساختار تلفن – آدرس منزل_ایمیل _شماره موبایل ، ذخیره کنید .باید از یک متغیر مرکب یا همان complex استفاده کرد . اکنون با مثال نحوه تعریف آن را نشان می دهم .ما در بخش قبل گفتیم که یک Entity می تواند شامل خصوصیاتی باشد که از نوع متغیرهای متعارف باشد مثلا عددی یا کارکتری و غیره ، اما اگر بخواهیم خصوصیتی پیچیده تر و با نوع مرکب داشته باشیم ، مثلا یک خصوصیت داشته باشیم که از نوع ساختاری یا یک نوع مرکب و پیچیده ، چکار بایدکرد . جواب همان Complex Types
شما باید ابتدا یک آیتم و متغیر از نوع Complex Types تعریف کنید و پس از آن در Entity مورد نظرتان یک خصوصیت از نوع Complex Property تعریف کنید که این خصوصیت مرکب بعدا از نوع Complex Types خواهد بود.
فرض کنید پروژه ای که قبلا ایجاد کرده ایم را باز کرده ایم ، به پنجره Model Browser دقت کنید
همانور که می بینید گزینه Complex Types را مشاهده می کنید . برای ایجاد آن بر روی Complex Types کلیک راست کرده و گزینه Create Complex Types را انتخاب کنید .یک آیتم Complex Types ایجاد می شودنام آن را AddressInfo می نامیم اکنون بر روی همان آیتم مجددا کلیک راست کنید و گزینه Add را انتخاب کنید و سپس گزینه Scalar Property را انتخاب کنید .لیستی از انواع برای شما باز می شود
فرض کنید می خواهیم آیتمی تعریف کنیم که آدرس را بصورت شماره تلفن و آدرس ذخیره کند پس 2 قسمت داریم یکی Phone , و دیگری Address است فرض کنیم اولی از نوع عددی و دومی کارکتری پس اولی را بصورت زیر تعریف کنید
Add ----à Scalar Property --à Int32
و سپس نام آن را phone وارد کنید برای دومی هم به همان ترتیب با این تفاوت که نوع آن String است .
اکنون ما یک آیتم complex Types تعریف کردیم اما ما مشخص نکردیم که این آیتم باید به کدام Entity ارتباط داشته باشد برای اینکار بر روی یکی از Entity های مدل فرضا Entity2 کلیک راست کرده و گزینه Complex Types را انتخاب می کنیم مانند شکل زیر خواهد شد
propertie مرتبط به این Complexproperty بروید و از قسمت Type مربوطه آیتم AddressInfo را انتخاب کنید در حقیقت ما اینجا خصوصیتی تعریف کردیم از نوع AddressInfo که در واقع یک نوع مرکب جدید تعریف شده توسط کاربر است .
Model-First Approach
در مطالب قبلی در مورد Entity و نحوه استفاده از ویزارد برای تولید کلاس در صورت وجود بانک صحبت کردم ، اما امروز می خواهم در مورد حالتی صحبت کنم که ما مدل کلاسها را ترسیم می کنیم و از این مدل می خواهیم بانک اطلاعاتی را ایجاد کنیم ، این ویژگی از جالبترین و مهمترین ویژگیهای اضافه شده در EF4 است که مایکروسافت آن را اضافه کرده است .
مانند مقاله بخش 2 ، یک پروژه تحت ویندوز باز کنید ،از منوی Project کزینه Add New Item و سپس گزینه ADO.NET Entity Data Model را انتخاب کنید اما از پنجره ظاهر شده در زیر گزینه empty model را انتخاب کنید
ماژول خالی برای شما ایجاد می شود ، اکنون جعبه ابزار را باز کنید و ابزار زیر را مشاهده کنید .
ابزارهایی را مشاهده می کنید که مختصرا آنها را توضیح می دهم.
Entity : به شما اجازه می دهد که یک Entity را ایجاد و طراحی کنید
Association : برای تعریف و ایجاد روابط میان دو عنصر Entity
Inheritance : برای ایجاد رابطه وراثت بین عناصر و کلاسهای Entity
زیاد نگران نباشید در ادامه مفصلا در مورد سه عنصر بالا توضیح خواهم داد. فعلا هدف آشنایی کلی با مفاهیم است .پس اکنون دست به کار می شویم و اولین entity را با استفاده از جعبه ابزار ایجاد می کنیم .یک Entity را از جعبه ابزار انتخاب کنید و آن را با کشیدن و رها کردن بر روی صفحه خالی ماژول بیاورید .
. یک properties دارد با نام Id است علاوه بر آن این خصوصیت یک primary Key برای این Entity ایجاد شده است .شما می توانید با انتخاب آن از شکل خصوصیات و پارامترهای آن را عوض کنید .پس از تنظیم پارامترهای دلخواه ، شما می توانید بر حسب نیازتون عناصر دیگری به Entity اضافه کنید . برای اینکار کافیست برروی Entity کلیک راست کنید و گزینه Add را انتخاب کنید .
اگر دقت کنید با دو گزینه scalar property , complex property مواجه می شویم ، شما نگران نباشید از بخش بعدی یعنی بخش چهارم وارد جزییات خواهیم شد و موارد را به تفصیل شرح خواهم داد .
اکنون شما گزینه scalar property را انتخاب کنید نام آن را CustomerFirstName قرار دهید و نوع آن یعنی Type را از نوع کارکتری یعنی string انتخاب کنید و بقیه را مطابق شکل زیر
و سپس خصوصیات دیگری را مطابق لیست زیر با نوعهای مشخص شده مانند حالت بالا اضافه کنید
CustomerLastName (String)
CustomerAddress (String)
CustomerCity (String)
CustomerState (String)
CustomerZipCode (String)
CustomerPhone (String)
ModifyDateTime (DateTime)
سپس یک Entity دیگر ایجاد کنید و عناصر زیر را به آن اضافه کنید
OrderID (int32)
CustomerID (int32)
ItemID (int32)
ModifyDateTime (DateTime)
اکنون ما 2 Entity داریم ، حالا می خواهیم یک ارتباط بین این 2 برقرار کنیم برای اینکار از جعبه ابزار Associtation را انتخاب کنید و سپس از Entity1 فیلد Id را انتخاب کنید و از Entity2 فیلد customerId را انتخاب کنید رابطه شما بین این دو فیلد مانند شکل زیر خواهد شد .
اکنون نوبت ایجاد بانک اطلاعاتی از مدول و کلاسهای بالا است . اکنون بر روی فضای خالی از صفحه مازول کلیک راست بزنید و گزینه Generate Database From Model را انتخاب کنید صفحه زیر نمایش داده می شود .
در اینجا شما باید بانک اطلاعاتی و رشته اتصال را مشخص کنید .دکمه next را بزنید و به مرحله بعد بروید صفحه ای برای شما نمایش داده می شود که مجموعه دستورات DDl را برای ایجاد این جدولها در بانک اطلاعاتی را بصورت فایلی ذخیره می کند .
دکمه Finish را کلیک کنید تا فایل مورد نظر شما ایجاد شود که حاوی کدهایی برای ایجاد بانک اطلاعاتی است .یک فایلی با فرمت .sql خواهد بود ، همانطور که در شکل بالا می بینید .اکنون برای اجرای اسکریپت بالا در فضای خالی از کد اسکریپت کلیک راست کرده و گزینه Execute Sql را مطابق شکل زیر انتخاب کنید ، اسکریپت شما در بانک اطلاعاتی مشخص شده ایجاد خواهد شد
به بانک اطلاعاتی خودتان بروید تا جدولهای ایجاد شده را مشاهده کنید .
ادامه دارد...
نکته : نوشتن آموزش گام به گام در فضای نت سخت است ، آن هم با توجه به مشغله های کاری که دارم ولی تمام تلاشم را بکار می گیرم که این بحث را به نحو مطلوبی آموزش بدهدم
در بخش قبل معرفی مختصر در مورد Entity Data Moule یا مخفف EDMداشتیم ، اما در این بخش به شرح مفصلتری می پردازم
قبل از آن شما بانک اطلاعاتی northwind را آماده کنید فایل این بانک را می توانید ازلینک دانلود کنید
ایجاد یک EDM
در نسخه های قبلی Entity Framework ما فقط می توانستیم برای بانک اطلاعاتی موجود از قبل یک مدل طراحی کنیم .که ما می توانستیم برای آن یک مدل مفهومی ایجاد کنیم .درواقع ما از بانک اطلاعاتی به مدل می رسیدیم ، اما حالا می خواهیم برعکس از مدل به بانک اطلاعاتی برسیم .
از مهمترین امکانات اضافه شده به Entity Framework 4 بصورت 2 مورد زیر است :
1-Model-first : به شما اجازه می دهد که ابتدا یک empty model ایجاد کنید ، و ابتدا model خودتان را تعریف کنید و سپس بانک اطلاعاتی و mapping و کلاسها را بر اساس model تعریف شده ایجاد کنید .
2-Code-only: به شما اجازه می دهد که برای استفاده از Entity Framework با استفاده از Plain Old CLR Objects یا مختصرا
POCO درواقع Entity خود را بدون استفاده از فایل EDMX ایجاد کنید .
اکنون برای یادگیری ابتدایی سعی می کنم ابتدا بر اساس اینکه بانک اطلاعاتی موجود است یک مدل طراحی می کنیم و بعدا با مدلی سرو کار خواهیم داشت که بر عکس یعنی اول مدل بعد بانک اطلاعاتی
آموزش حالت database-first approach
ما در اینجا با بانک اطلاعاتی northwind آموزش را ارایه می دهم با sql-server 2008 R2 و Visual Studio 2010 و دانت نت 4
شما می توانید از لینک زیر بانک اطلاعاتی را دانلود کنید .
خوب اکنون پس از نصب بانک اطلاعاتی سراغ vs برویم و یک پروژه Windows Forms Application ایجاد می کنیم مطمن باشید که .Net Framework 4 انتخاب شده باشد.
اکنون در پروژه ، سراغ منوی Project بروید و گزینه Add New Item را انتخاب کنید مانند شکل زیر :
در شکل بالا دقت کنید که از قسمت سمت راست گزینه data را انتخاب کنید و سپس گزینه ADO.NET Entity Data Model
را انتخاب کنید .با انتخاب این گزینه و وارد کردن نام مناسب ( در اینجا ما همان نام Model1.edmx را بصورت پیش فرض قبول می کنیم ) و دکمه Add را می زنیم .پس از آن وارد ویزارد Entity Data Model Wizard می شویم در این ویزارد ما گزینه
Generates from database را انتخاب می کنیم و به مرحله بعدی می رویم .در این صفحه مطابق شکل زیر :
ما ابتدا باید مقدار connections را مشخص کنیم پس بر روی دکمه New Connection کلیک کنید تا وارد صفحه Connection Properties بشوید در این صفحه ابتدا از قسمت نام سرور server name نام سرور بانک اطلاعاتی را انتخاب کنید و برحسب تنظیمات دستگاه شما از لیست بانکهای اطلاعاتی نام بانکnorthwind را انتخاب کنید .صفحه ویزارد شما مشابه شکل زیر خواهد شد .در این صفحه تیک مقابل جمله save entity connection ….. باعث می شود که رشته اتصال به بانک اطلاعاتی با همان نام مشخص شده در زیر آن در فایلی تحت عنوان App.config ذخیره شود .اکنون به مرحله بعد می رویم مطابق شکل زیر
خوب اکنون در صفحه بالا جدولهای و view ها و stored Procedure های بانک اطلاعاتی شما لیست می شوند.
در اینجا ما جدول Category و جدول products را انتخاب می کنیم و از قسمت view ها Products by Category را انتخاب می کنیم همچنین از stored procedure هم SalesByCategory را انتخاب می کنیم . و سپس دکمه finish را کلیک می کنیم .
نکته : حتما قبل از زدن دکمه finish دو تیک Pluralize و include foreign… را دیدید
Pluralize or singularize از مهمترین بهبودها در نسخه 4 EF است .در نسخه های قبلی EF خاصیت
Entity Set Name and Entity Name properties با یک نام بودند که این مساله باعث گیجی برنامه نویس می شد که خوشبختانه در این نسخه 4 امکان تفکیک براحتی فراهم شده است مثلا برای
category به شکل زیر دفت کنید
و در نهایت شما فایل module1.edmx را باز کنید که مطابق شکل زیر نمای جداول بانک اطلاعاتی رادر فضای ماژولار EDM نمایش می دهد ،
فعلا نگران نباشید در بخشهای بعدی با جزییات بیشتر EDM آشنا خواهیم شدادامه دارد...