جديدترين مقالات مرتبط با مدیریت فناوری اطلاعات

Microsoft Entity Framework

ارسال شده توسط احمد محمدی | 9 February, 2016 | بازدید‌ها (365)

    مایکروسافت قبل از معرفی  Entity Framework   ، تکنولوژیهای ado , rdo  و سرانجام ado.net  را ارایه کرده بود و برای اکثر این تکنولوژیها زمان زیادی گذاشته بود ، هر کدام از اینها در زمان خود یک تکنولوژی نوینی و حرکت عظیمی بود . اما با گسترش مفاهیم شی گرایی و نیاز مبرم برنامه نویسان به ایجاد اشیا از داده ها و جداول بانکهای اطلاعاتی مایکروسافت اقدام به توسعه تکنولوژی  ado.net کرد و ابتدا امکانات linq  و سپس  Entity Framework  را برای تعامل بهتر با شی گرایی مطرح کرد .

    تا قبل از آن برنامه نویسان زمان زیادی را برای برنامه نویسی اشیا جدولهای بانکهای اطلاعاتی و ارتباطات آن صرف می کردند و هر گونه تغییر در جداول بانکها مستلزم تغییرات فراوانی در کد نویسی است .

    ابتدا فهرستی از ابزارهای مدل سازی را معرفی می کنم :

     

    1-ERM 
    یا  Entity Relationship Model ابزاری برای مدل سازی پایگاههای داده ای رابطه ای .

    2- UML 
    یا Unified Modeling Language زبان استاندار ماژول سازی اشیا و کلاسها

    3-ORM 
    یا  Object-Relational Mappingروشی و ابزاری برای ایجاد تعامل ماژولار میان اشیا بانکهای اطلاعاتی رابطه ای و زبانهای برنامه نویسی شی گرا

    4-DFD
    یا Data Flow Diagram  ابزاری برای نمایش نموداری از جریان داده ها و فرآیند سیستم

     

    البته چند ORM  دیگر هم وجود دارد یکی NHibernate و SPRINT.net هر دوتای آنها از جاوا مشتق شده اند و توانمنیدهای فراوانی دارند اما بحث ما Entity  Framework.Net4       است .

    البته لیست بالا لیست کاملی نیست و از حوصله این بحث خارج است .

     

    قبل از ورود به بحث Entity Framework  مقدمه ای در مورد Entity Data Model یا مختصرا EDM  باید بیان شود .EDM  در حقیقت پایه و پیش نیاز Entity Framework است و شامل سه model  است

    1-
    مدل مفهومی 2-مدل منطقی 3-مدل ذخیره سازی یا فیزیکی

    ما می توانیم بگوییم که EDM  یک نسخه تکامل یافته ERM  است .ما در مدل EDM  در مورد ساختار شی گرای business objects داده ها بحث می کنیم در حالی که در مدل ERM  ما در مورد طرح بانک اطلاعاتی بحث می کنیم .که باید تفاوت میان مدل داده و مدل شی را متوجه شویم ، شکل زیر یک مدل داده را نشان می دهد در حالی که شکل بعدی مدل شی گرا از بانک اطلاعاتی ما را نشان می دهد.







    Entity 
    چیست ؟

    ما برای فهم Entity Framework  باید ابتدا مفهوم Entity  را متوجه شویم ، البته بعدا در مورد این مفصلا خواهم نوشت ولی فعلا برای فهم بیشتر مقایسه ای با object  و relational data  انجام می دهم

    تشابه Entity  با شی یا object

    1-   Entity
    مانند شی دارای انواع تعریف شده برای داده ها و فیلدها است

    2-  Entity 
    مانند شی دارای خصوصیت یا properties است

    3-   
    هر    Entity  یک هویت متمایزی دارد

    4-   
    یک خصوصیت   Entity  می تواند ارجاعی به Entity  دیگر باشد

     

    تفاوت Entity  با شی یا object

    1 -Entity 
    می تواند یک فیلد اصلی یا primary keys داشته باشد

    2-Entity 
    می تواند دارای ارتباطی با Entity  دیگر باشدمانند ارتباطات موجود در بانک اطلاعاتی

     

    تشابه Entity  با داده رابطه ای relational data

    1-Entity 
    یک ارتباط چند گانه مانند داده ها با دیگر entity  می تواند داشته باشد

    2-Entity   
    مانند داده ها می تواند کلید اصلی یا primary key داشته باشد

     

    تفاوت Entity  با داده رابطه ای relational data

    1-Entity 
    از داده ها با نوع پیچیده  complex typesپشتیبانی می کند

    2-Entity 
    از وراثت موجود در کلاسها پشتیبانی می کند

    3-Entity 
    داده های فیزیکی را ذخیره نمی کند .

     

    پس Entity  Framework   چیست ؟

    درواقع Entity Framework   تکنولوژی توسعه یافته ADO.Net  است که فاصله بین برنامه نویسی شی گرایی و بانک اطلاعاتی رابطه ای را پر می کند .این فاصله معمولا تحت عنوان عدم تطابق شناخته می شود. و یک تکنیک برنامه نویسی برای تبدیل ارتباطات در Database به مفاهیم Object Oriented در برنامه نویسی است. در واقع می‌توان گفت که کلا‌س ها را به Table ها map می‌کند. وقتی که شما می‌خواهید به Database دسترسی پیدا کنید، یا اطلاعاتی را ذخیره کنید، این کارها را مستقیما بر‌ روی اشیاء ( Object تان ) انجام می‌دهید. Entity  Framework مدل داده ها را به سه بخش تقسیم می کند 1-مدل مفهومی یا ادراکی 2-مدل منطقی 3- مدل فیزیکی

     

    در نسخه های قبلی 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 را انتخاب کنید  مانند شکل زیر
    Entity_Framework3 - Entity Framework 4  part 1 - متا

    در شکل بالا دقت کنید که از قسمت سمت راست گزینه data  را انتخاب کنید و سپس گزینه ADO.NET Entity Data Model

    را انتخاب کنید .با انتخاب این گزینه و وارد کردن نام مناسب ( در اینجا ما همان نام Model1.edmx را بصورت پیش فرض قبول می کنیم ) و دکمه Add را می زنیم .پس از آن وارد ویزارد Entity Data Model Wizard می شویم در این ویزارد ما گزینه

        Generates from database را انتخاب می کنیم و به مرحله بعدی می رویم .در این صفحه مطابق شکل زیر :
    Entity_Framework4 - Entity Framework 4  part 1 - متا

    ما ابتدا باید مقدار connections را مشخص کنیم پس بر روی دکمه New Connection  کلیک کنید تا وارد صفحه Connection Properties بشوید در این صفحه ابتدا از قسمت نام سرور server name  نام سرور بانک اطلاعاتی را انتخاب کنید و برحسب تنظیمات دستگاه شما از لیست بانکهای اطلاعاتی نام بانکnorthwind  را انتخاب کنید .صفحه ویزارد شما مشابه شکل زیر خواهد شد .در این صفحه تیک مقابل جمله save entity connection ….. باعث می شود که رشته اتصال به بانک اطلاعاتی با همان نام مشخص شده در زیر آن در فایلی تحت عنوان App.config  ذخیره شود .اکنون به مرحله بعد می رویم مطابق شکل زیر

    Entity_Framework5 - Entity Framework 4  part 1 - متا

    خوب اکنون در صفحه بالا جدولهای و 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 به شکل زیر دفت کنید

    Entity_Framework6 - Entity Framework 4  part 1 - متا

    و در نهایت شما فایل module1.edmx  را باز کنید که مطابق شکل زیر نمای جداول بانک اطلاعاتی رادر فضای ماژولار EDM نمایش می دهد ،

    Entity_Framework7 - Entity Framework 4  part 1 - متا
    Model-First Approach
    در مطالب قبلی در مورد Entity  و نحوه استفاده از ویزارد برای تولید کلاس در صورت وجود بانک صحبت کردم ، اما امروز می خواهم در مورد حالتی صحبت کنم که ما مدل کلاسها را ترسیم می کنیم و از این مدل می خواهیم بانک اطلاعاتی را ایجاد کنیم ، این ویژگی از جالبترین و مهمترین ویژگیهای اضافه شده در EF4 است که مایکروسافت آن را اضافه کرده است .

    مانند مقاله بخش 2 ، یک پروژه تحت ویندوز باز کنید ،از منوی Project  کزینه Add New Item  و سپس گزینه ADO.NET Entity Data Model را انتخاب کنید اما از پنجره ظاهر شده در زیر گزینه empty model را انتخاب کنید
    Entity_Framework8 - Entity Framework 4  part 1 - متا

    ماژول خالی برای شما ایجاد می شود ، اکنون جعبه ابزار   را باز کنید و ابزار زیر را مشاهده کنید .Entity_Framework9 - Entity Framework 4  part 1 - متا

    ابزارهایی را مشاهده می کنید که مختصرا آنها را توضیح می دهم.

    Entity  : به شما اجازه می دهد که یک  Entity  را ایجاد و طراحی کنید

    Association : برای تعریف و ایجاد روابط میان دو عنصر Entity

    Inheritance  : برای ایجاد رابطه وراثت بین عناصر و کلاسهای Entity

     زیاد نگران نباشید در ادامه مفصلا در مورد سه عنصر بالا توضیح خواهم داد. فعلا هدف آشنایی کلی با مفاهیم است .پس اکنون دست به کار می شویم و اولین entity  را با استفاده از جعبه ابزار ایجاد می کنیم .یک Entity  را از جعبه ابزار انتخاب کنید و آن را با کشیدن و رها کردن بر روی صفحه خالی ماژول بیاورید .

    Entity_Framework10 - Entity Framework 4  part 1 - متا

    اکنون به اولین Entity  ایجاد شده دقت کنید .

    . یک properties  دارد با نام Id است علاوه بر آن این خصوصیت یک primary Key  برای این Entity  ایجاد شده است .شما می توانید با انتخاب آن از شکل خصوصیات و پارامترهای آن را عوض کنید .پس از تنظیم پارامترهای دلخواه ، شما می توانید بر حسب نیازتون عناصر دیگری  به Entity   اضافه کنید . برای اینکار کافیست برروی Entity کلیک راست کنید و گزینه Add  را انتخاب کنید .

    Entity_Framework11 - Entity Framework 4  part 1 - متا

    اگر دقت کنید با دو گزینه scalar property , complex property  مواجه می شویم ، شما نگران نباشید از بخش بعدی یعنی بخش چهارم وارد جزییات خواهیم شد و موارد را به تفصیل شرح خواهم داد .

    اکنون شما گزینه scalar property  را انتخاب کنید نام آن را  CustomerFirstName قرار دهید و نوع آن یعنی Type  را از نوع کارکتری یعنی  string  انتخاب کنید و بقیه را مطابق شکل زیر


    Entity_Framework12 - Entity Framework 4  part 1 - متا

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

     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  را انتخاب کنید رابطه شما بین این دو فیلد مانند شکل زیر خواهد شد .


    Entity_Framework13 - Entity Framework 4  part 1 - متا

    اکنون نوبت ایجاد بانک اطلاعاتی از مدول و کلاسهای بالا است . اکنون بر روی فضای خالی از صفحه مازول کلیک راست بزنید و گزینه Generate Database From Model  را انتخاب کنید صفحه زیر نمایش داده می شود .


    Entity_Framework14 - Entity Framework 4  part 1 - متا

    در اینجا شما باید بانک اطلاعاتی و رشته اتصال را مشخص کنید .دکمه next  را بزنید و به مرحله بعد بروید صفحه ای برای شما نمایش داده می شود که مجموعه دستورات DDl را برای ایجاد این جدولها در بانک اطلاعاتی را بصورت فایلی ذخیره می کند .

    Entity_Framework15 - Entity Framework 4  part 1 - متا

    دکمه Finish  را کلیک کنید تا فایل مورد نظر شما ایجاد شود که حاوی کدهایی برای ایجاد بانک اطلاعاتی است .یک فایلی با فرمت .sql  خواهد بود ، همانطور که در شکل بالا می بینید .اکنون برای اجرای اسکریپت بالا در فضای خالی از کد اسکریپت کلیک راست کرده و گزینه Execute Sql  را مطابق شکل زیر انتخاب کنید ، اسکریپت شما در بانک اطلاعاتی مشخص شده ایجاد خواهد شد

    Entity_Framework16 - Entity Framework 4  part 1 - متا


    نگاهی عمیق تر به Entity Data model

    ابتدا از محیط کاری و پنجره های طراحی EDM  صحبت می کنیم . در کار با EDM  4 پنجره از محیط طراحی برای شما بسیار مفید است

    1-Designer surface : سطح بصری طراحی می باشد که شما می توانید به کمک آن ساختار و مدل EDM  را ایجاد و یا تغییر دهید.

    2-Mapping Detail windows  : پنجره ای برای map  کردن و تغییر در این پنجره شما یک ساختار فیزیکی از عناصر Entity را مشاهده می کنید

    3-Toolbox  : جعبه ابزار که برای همه مشخص است و در مقاله قبل با آن بیشتر آشنا شدیم

    4-Model Browser Window  : این پنجره ساختاری درختی از مدل مفهومی و منطقی مدل نمایش می دهد .
    در شکل زیر این چهار پنجره به تفکیک نمایش داده شده است .


    Entity_Framework17 - Entity Framework 4  part 1 - متا

    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_Framework18 - Entity Framework 4  part 1 - متا

    دراینجا Entity Set  اول شامل دوتا Entity Type  است .

    Scalar Properties  : اگر مقاله های قبلی را مطالعه کرده باشید متوجه شدید که هر Entity Type  دارای مجموعه ای از خصوصیات (Properties  ) می باشد که یکی از آنها Scalar Properties  است . اگر بخواهیم آن را به زبان ساده بیان کنیم باید بگویم که این آیتم در واقع خصوصیتهایی را تعریف می کند که مقادیر رایج متغیرها یعنی عدد ، رشته ، کارکتر و تاریخ و غیره را می پذیرد .به تعبیری دیگر همان فیلدها بانک اطلاعاتی هستند که هر کدام دارای نوع هستند اگر شما یک Entity Type  از مثالهای قبل ایجاد کرده باشید کافیست یکی از خصوصیات را انتخاب کنید و به پنجره Properties  دقت کنید


    Entity_Framework19 - Entity Framework 4  part 1 - متا


    می بینید هر کدام از فیلدها یا همان خصوصیتهای 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  دقت کنید
    Entity_Framework20 - Entity Framework 4  part 1 - متا

    همانور که می بینید گزینه Complex Types  را مشاهده می کنید . برای ایجاد آن بر روی Complex Types  کلیک راست کرده و گزینه Create Complex Types را انتخاب کنید .یک آیتم Complex Types  ایجاد می شودنام آن را AddressInfo  می نامیم اکنون بر روی همان آیتم مجددا کلیک راست کنید و گزینه Add  را انتخاب کنید و سپس گزینه Scalar Property را انتخاب کنید .لیستی از انواع برای شما باز می شود


    Entity_Framework21 - Entity Framework 4  part 1 - متا

    فرض کنید می خواهیم آیتمی تعریف کنیم که آدرس را بصورت شماره تلفن و آدرس ذخیره کند پس 2 قسمت داریم یکی Phone , و دیگری Address است فرض کنیم اولی از نوع عددی و دومی کارکتری پس اولی را بصورت زیر تعریف کنید

    Add  ----à Scalar Property --à Int32

    و سپس نام آن را phone  وارد کنید برای دومی هم به همان ترتیب با این تفاوت که نوع آن String  است .

    Entity_Framework22 - Entity Framework 4  part 1 - متا


    اکنون ما یک آیتم complex Types  تعریف کردیم اما ما مشخص نکردیم که این آیتم باید به کدام Entity  ارتباط داشته باشد برای اینکار بر روی یکی از Entity  های مدل فرضا Entity2  کلیک راست کرده و گزینه Complex Types  را انتخاب می کنیم مانند شکل زیر خواهد شد

    Entity_Framework23 - Entity Framework 4  part 1 - متا

    اکنون به پنجره

    propertie مرتبط به این Complexproperty بروید و از قسمت Type  مربوطه آیتم AddressInfo را انتخاب کنید در حقیقت ما اینجا خصوصیتی تعریف کردیم از نوع AddressInfo  که در واقع یک نوع مرکب جدید تعریف شده توسط کاربر است .

    وقتی شما به مدل نگاه می کنید تنها نمایی جزیی از کار را می بینید ، اکنون شما باید بدانید که در پشت پرده مدل شما چه فایلها و کدهایی ایجاد شده است .برای این کار مطابق مثالهای قبل یک پروژه جدید ایجاد کنید و از بانک اطلاعاتی Northwind  یک مدل از جداول categories  و  products ایجاد می کنیم . مطابق شکل زیر

    Entity_Framework25 - Entity Framework 4  part 1 - متا

    خوب اگر خاطرتان باشد گفتیم که هر مدل که ایجاد می کنیم محتویات آن در یک فایل .edmx  است .ما اکنون می خواهیم ساختار دقیقتر و جزیی تری از این فایل را بدانیم برای اینکار بر روی فایل مدل خود فرضا فایل Model1.edmx  کلیک راست کنید و از گزینه های باز شده گزینه open with  را انتخاب کنید از پنجره زیر گزینه xml Editor  را انتخاب کنید .

    Entity_Framework26 - Entity Framework 4  part 1 - متا

    دکمه ok  را کلیک کنید . فایلی در ساختار XML  برای شما باز می شود.

    Entity_Framework27 - Entity Framework 4  part 1 - متا

    در واقع ساختار بالا یک ساختار فراداده metadata از فایل model1.edmx است . فایل و ساختار Metadata  معمولا یک ساختار معنایی ، تشریح کننده محتوا ، محل نگه داری ، خصوصیات فیزیکی ، نوع و شکل منبع است . در واقع ما اینجا هم چنین فایلی برای مدل داریم .فایل .edmx دارای سه بخش Metadata  است .

    1-Store schema definition language  مخفف آن ssdl  : معمولا ما به آن مدل فیزیکی و ذخیره ای از داده های مدل می گوییم

    2-Conceptual Schema definition language   مخفف آن csdl  : معمولا ما با آن مدل مفهومی یا ادراکی مدل می گوییم

    3-Mapping specification language   مخفف آن MSL  : معمولا مدل Map از ساختار مدل و داده ها است .

    اکنون اگر به تصویر بالا دقت کنید تمام عناصر ذکر شده را به ترتیب دربخشهای SSDl content  و CSDL content  و Mapping content  مشاهده می کنید .

     

    1-SSDL    مدل فیزیکی :ما  در اینجا ساختار ذخیره ای و فیزیکی مدل را با فرمت Xml  داریم . اگر به این فرمت دقت کنید مهمترین عناصر آن به ترتیب زیر هستند :

    1-1-Schema  : اگر دقت کنید در سطر اول ظاهر می شود از فیلدهای اجباری است که مهمترین عنصر آن NameSpace  است که اجباری است و باید باشد و باید به فضای نام Entity  ما اشاره کند .در واقع مفهومی شبیه به همان مفهوم فضای نام Name Space  در کلاسها و کد نویسی دارد.


    2-1- EntityType : نشان دهنده اشیا Object  موجود در مدل است . نام هرEntity Type  در آن فضای نام باید منحصر به فرد باشد و تکرار مجاز نیست هر کدام از EntityType  ها نشان دهنده مدلی از جدول در بانک اطلاعاتی است مثلا در این مثال products  نمایش دهنده مجموعه رکوردهای جدول product  از بانک اطلاعاتی است .


    property-3-1 : هر کدام از EntitType  های مدل ما یکسری عناصر دارند ، که این عناصر دارای نام و نوع و طول و مقدار کارکتر یا محدوه عددی و مقیاس و تهی پذیر یا خیر می باشد .در واقع اگر بخواهیم تشبیه کنیم ، می توان گفت ما در اینجا با فیلدهای جدول سرو کار داریم .

    4-1 - key :

    1-4-1  PropertyRef : ما در اینجا فیلدی را مشخص می کنیم که کلید اصلی جدول داده ها یا مدل داده های ما است مثلا اگر در بانک اطلاعاتی Product  فیلد اصلی ProductId  باشد پس مقدار این آیتم هم productId خواهد بود.


    Association  -6-1

    -1-6-1    End : همانطور که می دانید بانک اطلاعاتی از ارتباطات بین عناصر برخوردار هستند ارتباطاتی مانند ارتباط یک به یک و یک به چند یا چند به چند و.. در آمزشهای قبلی ذکر کردم که عناصر مدل می توانند مانند بانکهای اطلاعاتی باهم ارتباط داشته باشند که از طریق این خصوصیت امکان پذیر است

    Associationset  نشان دهنده ارتباط و نام و مشخصات آن و گره End   نشان دهنده راسهای ارتباط بین عناصر است.

    referential constraint   : این قسمت در واقع نشان دهنده قیدهای ارتباط است ما می دانیم در هر ارتباط بین عناصر 2 جدول یک کلید اصلی است و کلید دیگر باید کلید خارجی یا ثانویه باشد .


                      principal : نشان دهنده منشا و کلید اصلی ارتباط

                     Dependent      : نشان دهنده کلید ثانویه یک ارتباط بین عناصر است .

     

    8-1- EntityContainer     : به طور کلی در این قسمت ما دو گره Entityset  و Associatioset را داریم .و درواقع ساختاری کلی از منبع داده را برای ما نمایش می دهد


    9-1-   EntitySet   : گروهی از EntityType  های منبع داده را نمایش می دهد.


    10-1- Associationset  : مجموعه و ساختار کلی ارتباطات را نمایش می دهد

     

    بطور کلی بحث در مورد ساختار SSDL بسیار مفصل است اما در این مطلب مختصری برای آشنایی   بیان کردم .

    2-CSDL مدل مفهومی یا ادراکی : ما در اینجا می توانیم ادعا کنیم که با یک الگو و ساختاری نمونه برای مدل داده ها سرو کار داریم . ساختار آن بسیار شبیه به ساختار SSDl  است . البته با تغییراتی بیشتر .

    تفاوت این دو قسمت بالا زمانی نمایان می شود که ما حالت مدل را انتخاب کنیم ، یعنی اگر ما از بانک اطلاعاتی، مدل را بسازیم در این حالت ما SSDL  را خواهیم داشت . اما اگر یادتان باشد ما حالتی داشتیم که اول مدل را طراحی می کردیم و سپس بر اساس مدل بانک اطلاعاتی را می ساختیم در این حالت ما  فقط محتویات مفهومی و معنایی مدل  CSDL  را خواهیم داشت.


    3-MSL  : در واقع حلقه وصل بین SSDL  و CSDL است . به شکل زیر دقت کنید :


    Entity_Framework28 - Entity Framework 4  part 1 - متا


        در شکل بالا می بینید که چگونه عمل Map  انجام می شود . مهمترین عناصر  MSL  به شرح زیر است :

    1-Mapping  : عنصر ریشه ای می باشد که در برگیرنده تمام آیتمهای MSL  است .

    2-EntiyContainerMapping  : در این قسمت نام هر Entitycontainer  موجود در دو بخش SSDL  و CSDL  را شامل می شود در واقع ظرفی ایجاد می کند برای ایجاد ارتباط بین   SSDL EntityContainer  و بخش

    CSDL Entitycontainer

    3-EntitySetMapping : این بخش نیز ارتباطی ایجاد می کند بین هر بخش Entityset موجود در SSDL  و CSDl

    4-   ٍEntityTypeMapping  :  این بخش نیز ارتباطی ایجاد می کند بین EntityType های دو بخش SSDL و CSDL

    بحث در مورد SSDL  و CSDL  و MSL  بسیار مفصل است ، تا اینجا بحث را در این بخش خاتمه می دهم اما در این مقاله فهمیدیم که وقتی یک مدل از بانک اطلاعاتی ایجاد می کنیم در پشت صحنه ایجاد یک فایل Metadata  چگونه اطلاعات ساختار بندی می شود.

    Normal 0 false false false EN-US X-NONE FA MicrosoftInternetExplorer4

    اکنون نوبت به نوشتن دستورات است و چگونه با داده های بوسیله مدلها در تعامل باشیم ، بازیابی اطلاعات و حذف و تغییر چگونه خواهد بود . ما تا قبل از آمدن مفاهیم ORM  ها و غیره برای انجام کویری برروی داده ها مستقیما با بانکهای اطلاعاتی سرو کار داشتیم در واقع با دستورات T-SQL  سرو کار داشتیم . اما از اینجا به بعد با دستورات LINQ to Entities  و Entity Sql  سروکار خواهیم داشت .این دستورات با EDM  سروکار دارند . اما لازم دانستم قبل از وارد شدن به این مبحث ابتدا در مورد Logical Query Processing  در  sql server کمی صحبت کنم . حتما تا حالا با انواع و اقسام دستورات پرس و جو با بانکهای اطلاعاتی سرو کار داشته اید ، آیا تا حالا از خود پرسیده اید که فرایند و تسلسل این دستورات چگونه است ، کلا در یک عبارت پرس و جو از چند جدول بانک اطلاعاتی ابتدا کدام دستور اجرا می شود .

    ما می دانیم که هر عبارت پرس و جو دارای عناصر زیر است .

    From ,select,where,on , join,group by , having ,order by,top , 
    است . ترتیب اجرای آنها در یک عبارت جستجو بصورت زیر است .

     

    نقل قول

    1. FROM
    2. ON
    3. OUTER
    4. WHERE
    5. GROUP BY
    6. CUBE | ROLLUP
    7. HAVING
    8. SELECT
    9. DISTINCT
    10 ORDER BY
    11. TOP


    1-
    عبارت from  در واقع اول از همه اجرا می شود به این دلیل که ابتدا باید جدوال منبع جستجوی ما مشخص شوند

    2-
    عبارت on ,outer ,…. در واقع عبارتهای الحاقی ، همان عبارتهایی که بعد از مشخص شدن جدولهای مورد نظر ، حالا باید مشخص شود که ترکیب این جدولهای چگونه است .

     

    3-
    از میان ترکیب چند جدول حالا بر اساس عبارت where  مجموعه ای از داده ها انتخاب می شوند

     

    4-
    در ادامه از میان این داده های انتخاب شده ، داده ها بر اساس فیلدهایی گروه بندی می شوند.

     

    5-
    وباز در ادامه از میان گروهها ممکن است مجموعه ای از عناصر بر اساس دستور having  فی_لتر شوند

     

    6-select 
    اینجا با این دستور در واقع داده ها برای نمایش و نتیجه برگزیده می شوند .

     

    7-
    از میان داده ها برگزیده شده ممکن است سورت خاصی مد نظر شما باشد که با استفاده از order by  عمل سورت برای شما انجام می شود

     

      Querying with the Entity Framework
    قبل از آنکه در مورد کویری با مدل بحث کنیم بد نیست بدانیم که کویری های ما با کلاس مدل سروکار دارند لذا نیم نگاهی به کلاس سازنده مدل می اندازیم.

    اگر کلاس مدل را باز کنید متوجه دو بخش عمده Context , entity  می شوید . در واقع کلاس اصلی سازنده مدل ما از کلاس objectcontext  ارث بری می کند .در شکل زیر نموداری کلی از کلاس را نشان می دهد .
    Entity_Framework30 - Entity Framework 4  part 1 - متا

    به طور خلاصه می توان گفت که هر کلاس مدل دارای ساختار مشابه شکل فوق است . ما وقتی مدل خود را ایجاد می کنیم ، کلاس تشکیل شده بصورت عمده دارای دو object  است . 1- شی object context  و 2- شی Entity Type

    ما در اجرای کویری عمدتا با این دو شی سر و کار خواهیم داشت .

     

    Object Context   : اصلی ترین و مهمترین کلاسی که ما از آن استفاده می کنیم ، با ایجاد مشتقی از این کلاس ما کلاسی خواهیم داشت که رشته اتصال به بانک اطلاعاتی و سازنده های کلاس و حالت کلاس برای انجام اعمال تغییر و حذف و ثبت استفاده می شود .

     

    Entity Type  : قسمت مهم دیگر است که از کلاس Entityobject  مشتق می شوند .از مهمترین کارهایی که این کلاس برای ما ارایه می دهد تعریف عناصر موجودیت و خصوصیتهای آنها و ارتباطات بین عناصر موجودیت و ...

     

    اکنون که بطور خلاصه با دو کلاس آشنا شدیم ، چگونه می توانیم کویری برای مدل ایجاد کنیم ، کلا برای نوشتن کویری بر یک مدل ما سه نوع روش کویری داریم .

     

    1-LINQ to Entities  : در این روش ما از دستورات زبان LINQ  استفاده می کنیم .

     

    2-Entity Sql  : یک زبانی که با اشیا سرو کار دارد و به شما امکان می دهد که کویری خود را ب روی اشیا بدون نیاز به زبان  Tsql  انجام دهید .

     

    3-Querying with Method  : متدهایی از شی objectquery  هستند که به شما اجازه می دهند با ترکیبی از عبارتهای لامبدا  Lambdas   کویری خود را بنویسید .

    شاید این پرسش برای خیلی ها مطرح شود که چرا برای نوشتن کوئری باید از چند روش استفاده کرد و کلا چرا این روشها معرفی شده است و تفاوت بین این روشها چیست ؟

    من ترجیح دادم قبل از وارد شدن به مبحث کوئری کمی در مورد ساختار و نحوه انجام کوئریها صحبت کنم .

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

    شاید این پرسش برای خیلی ها مطرح شود که چرا برای نوشتن کوئری باید از چند روش استفاده کرد و کلا چرا این روشها معرفی شده است و تفاوت بین این روشها چیست ؟

    من ترجیح دادم قبل از وارد شدن به مبحث کوئری کمی در مورد ساختار و نحوه انجام کوئریها صحبت کنم .

    با توجه به پیشینه زبان LINQ  برای مایرکروسافت ;  می توان نتیجه گرفت که هدف اصلی از ارایه LINQ TO Entities   در واقع توسعه ای برای این زبان است و امکانی برای برنامه نویسانی است که با این زبان سر و کار دارند.علاوه بر این استفاده از LINQ  مقادیر برگشتی کوئری بصورت جدولها و ردیف و ستون نیست .بلکه بصورت object  است .محدودیت زبان LINQ  در این است که فقط در زبانهای سی شارپ و vb.net  پشتیبانی می شود و برای سایر زبانهای دات نت قابل استفاده نیست . علاوه بر این به هنگام کامپایل باید به زبان متدی Query method  تبدیل شود تا برای CLR  قابل فهم باشد .

    زبان Entity SQL  : این زبان بسیار شبیه به زبان T_SQL  است . با این تفاوت که این زبان می تواند با کلاسها و اشیا سروکار داشته باشد و به تبع آن از وراثت و ارتباطات بین کلاسها به خوبی پشتیبانی می کند. . در واقع ما به کمک Entity SQL  می توانیم همه به صورت شی گرا و هم بصورت داده ها رکوردی سطر و ستون ;  با بانک اطلاعاتی سروکار داشته باشیم .و این مهمترین دلیل برتری Entity Sql  بر زبان LINQ to Entity است .

     

    در نهایت زبان Query Method  لایه ای پایینتر است ، چرا که فقط می تواند با با زبانهای بالا ترکیب شود و کویریهای بسیار قدرتمندتری را تولید کند . از مهمترین خصوصیت این روش خلاصه نویسی و استفاده از عبارتهای لامبدا است . .

    اکنون به شکل زیر دقت کنید تا متوجه شوید که   وLINQ to Entities Entity Sql  چگونه با داده ها تعامل می کنند
    IC314061 - Entity Framework 4  part 1 - متا

    همانطور که در شکل بالا می بینید . اگر بخواهیم با داده ها بصورت شی یا object  سر و کار داشته باشیم . با استفاده از زبان LINQ to Entities   و Entity SQL  ما می توانیم با شی object service  در تعامل باشیم . در این تعامل ما کاملا با کلاسها از جمله کلاس objectcontext  و کلاسها داده  data class  سر و کار داریم .

    حال اگر به شکل بالا دقت کنید می بینید که  LINQ to Entites برای انجام کویری چه فرایندی را طی می کند . علاوه بر این   نمی تواند مستقیما به لایه EntityClientLINQ to Entites  دسترسی داشته باشد در حالی که  Entity SQL می تواند مستقیما با لایه  EntityClient دسترسی داشته باشید و داده ها را بصورت رکوردی و ستون و ردیف داشته باشد


    EntityClient  چیست ؟ همانطور که در شکل بالا و در شکل پایین می بینید ، این لایه بسیار شبیه به لایه های Sqlclient ,OracleClient ,…. است. این لایه مدیریت رشته اتصال و command ها و غیره را کنترل و پردازش می کند .سرو کار کوئری در این لایه با داده ها بصورت شی و Object  نیست بلکه بصورت داده های ستونی و ردیفی است ، علاوه بر این این لایه با EDM  در ارتباط مستقیم است .

    ArticleImage - Entity Framework 4  part 1 - متا

    امیدوارم توانسته باشم فرق و ساختار کویریها را به خوبی بیان کنم

    Entity SQL  part 1
    در بخش قبل در مورد LINQ to Entities  صحبت کردیم . همچنین در بخشهای قبلی اگر خاطرتان باشد گفتم که Entity SQL  هم می تواند از طریق ObjectService  و هم مستقیما می تواند از طریق EntityClient  با بانک اطلاعاتی ارتباط برقرار کند . علاوه بر اینها ذکر کردیم که به دستورات T_SQL  شبیه است . بنابراین باید مطالب را در 3 بخش توضیح دهم . بخش اول در مورد شباهتها و تفاوتهای Entity SQL  و بخش دوم در مورد تعامل Entity SQL  با ObjectService    و بخش سوم در مورد تعامل Entity SQL  با EntityClient  خواهد بود .

     

    بخش اول : تفاوتهای Entity SQL  با دستورات T-SQL

     

    1-وراثت و ارتباطات

    همانطور که می دانید در مدل ما به دلیل وجود کلاسها .، از مفهوم وراثت و ارتباط بین عناصر پشتیبانی می کند در حالی که T-SQL  فقط از ارتباطات بین عناصر پشتیبانی می کند . علاوه بر این Entity SQL  در واقع با مدل مفهومی Conceptual entity  سرو کار دارد .

     

    2-Collections

    Entity SQL  همانند یک کلکسیونی از اشیا رفتار می کند در واقع داده های حاصل از آن براحتی در مجموعه Collection  ها قابل جایگزاری است .

     

    3-پشتیبانی از عبارتها

    شما در دستورات T-SQl  فقط با جدولها و ستونهای آن جدولها سروکار دارید در حالی که در Entity SQL علاوه بر اینها شما می توانید در کویری خود عبارتهای مختلفی را نیز داشته باشید .

     

    4-select Value

    این عبارت زمانی به کار می رود که ما بخواهیم آیتم مشخصی را بصورت آبجکت یا کلکسیون و یا یک مقدار اسکالر داشته باشیم . به شکل زیر دقت کنید .


    Entity_Framework37 - Entity Framework 4  part 1 - متا

    در شکل بالا یک ساختاری کلی از عبارت select value  در Entity SQL  نمایش می دهد . همانطور که می بینید . در دستور بالا ما یک Object  بر می گردانیم یعنی حاصل کویری ما یک Object  است .با همین فرم بالا ما می توانیم یک ابجکت و یا مقدار مشخص یا کلکسیونی از داده ها داشته باشیم .به شکل زیر دقت کنید .


    Entity_Framework38 - Entity Framework 4  part 1 - متا

    در کویری اول ما یک شی و در کویری دوم ما یک فیلد و در نهایت در کویری سوم ما یک ستونی بر می گردانیم که از نوع ارجاع Refrence  می باشد . مبحث این مطلب بعدها توضیح خواهم داد .

    خوب اکنون متوجه شدیم که عبارتهای کویری در Entity SQL  تا چه حد می توانند انعطاف پذیر باشند .

    اما اگر بخواهیم چندین آیتم انتخاب کنیم دیگر نیازی به عبارت value  نخواهیم داشت بلکه ذکر نام آن فیلدها کافی است .


    5-Referencing Columns 

    در دستورات زبان T-SQl  به هنگام انتخاب ستونهای جدول نیازی نیست که قبل از نام هر ستون ، نام جدول ذکر شود اما در Entity SQL  این امر ضروری است شما باید در مقابل نام هر ستون ، ابتدا نام مرجع آن را هم ذکر کنید .دستور پایین اولی یک دستور T-SQl  است و دومی یک دستور Entity SQL  است .

     

    select a from T

     

    select t.a as A from T as t

     

    6- عدم پشتیبانی از *

    حتما می دانید که در زبان T-SQL هر گاه بخواهیم تمام ستونهای یک جدول را انتخاب کنیم از عبارت * استفاده می کردیم اما در Entity SQL  این کار امکان پذیر نیست .

     

    7-عدم پشتیبانی از دستورات DDL  و DML  در Entity SQL

     

    8-پشتیانی از گروه بندی مستعار

    خیلی وقتها شما نیاز دارید برای کویری خود یک گروه بندی تعریف کنید . در زبان T-SQL  شما باید نام گروهها را به صراحت و مطابق نام ستونها تعریف کنید در حالی که در زبان Entity SQL  شما می توانید از عبارتها مستعار هم استفاده کنید . در عبارت زیر یک دستور T-SQL  است .

    select b + c, count(*), sum(a)

    from T

    group by b + c

     

    حال عبارت بالا در Entity SQl مشاهده کنید که چگونه برای گروه نام مستعار انتخاب کرده است .

     

    select k1, count(t.a), sum(t.a)

    from T as t

    group by t.b + t.c as k1

     

     

     

     

    Normal 0 false false false EN-US X-NONE FA MicrosoftInternetExplorer4

ارسال نظر
Info

توجه: از ارسال پيام هاي خصوصي در حالت لاگين براي نويسنده وبلاگ اجتناب نماييد.
در صورتی که در فرم ارسال نظر، نام شما توسط سیستم شناسایی شده باشد(در حالت لاگین) نظر شما بلافاصله منتشر خواهد شد.


در غیر اینصورت نظر شما پس از تایید توسط مالک وبلاگ منتشر خواهد شد.

 authimage

درباره من

  • 9163858398
  • جديدترين مقالات مرتبط با مدیریت فناوری اطلاعات (برنامه ريزي منابع سازماني ERP و..)
    احمد محمدی(کارشناس ارشد مدیریت - فناوری اطلاعات و مهندس نرم افزار)
    مشاور نظام مهندسی رایانه ای خراسان رضوی
    ahmad.mohammadi.a@gmail.com

آخرين مطالب بروز شده