Entity Framework یا Linq 2 SQL یا همون ADO.NET ؟

aa937709_EF_AtAGlance_1b(en-us,MSDN_10)

یکی از بحث های داغی که تو جلسات بحث و مشورت معماری نرم افزار رایجه صحبت سر انتخاب تکنولوژی دسترسی و مدیریت داده هاست…

گزینه های پیش رو:

» ADO.NET

» Linq 2 SQL یا به اختصار L2S

» و فرزند جدید و حاصل مدت ها تحقیق و تلاش و بهبود مایکروسافت: Entity Framework  به اختصار EF

NET Framework 4.0. بلوغ EF به شمار میاد، و عملا مایکروسافت بسیار محترمانه درخواست کرده که جناب برنامه نویس ایرانی که هر 20 سال یه بار یه روش جدید رو تجربه میکنی… خواهشا سنت شکنی بفرمایید و این محصول رو یه تست بزنید بلکه به نظر ملوکانه تون بد نیومد… تو این پست سعی دارم تا این 3 تکنولوژی رو کمی مقایسه کنم البته قصد ندارم معرفی کنم بلکه هدف مقایسه است… خواهیم دید EF نسبت به SubSonics که خود من بهش خیلی ارادت دارم من حیث معماری


point مقدمه { Microsoft Entity Framework چیست ؟؟} :

ADO.NET Entity Framework به گونه ای طراحی شده است تا توسعه دهندگان را قادر سازد در مقابل مدل های مرسوم مفهومی (conceptual)، از یک مدل جدید با امکان دسترسی و برنامه نویسی مستقیم بر اساس ساختار یک دیتابیس رایطه ای استفاده نمایند، هدف از تولید این مدل کاهش چشمگیر میزان کدنویسی، سهولت گسترش، ترمیم، بهبود و نگهداری  برنامه ها بوده است. به طور خلاصه میتوان از مزایای آن به موارد زیر اشاره کرد:
» برنامه های کاربردی قادر خواهند بود تا در مدل مفهومی خود (conceptual model) محوریت بیشتری به خود برنامه ببخشند به گونه ای که شیء گرایی، ارث بری، گونه ها (Type) های پیچیده تر و روابط بین جداول و اشیاء بهتر پیاده سازی شوند.
» برنامه ها (برنامه نویس ها) از هارد کدینگ (کدنویسی زیادی ابلهانه و طاقت فرسا) رها می شوند.
» بدون کوچک ترین تغییر کد برنامه خواهیم توانست مدل ارتباط بین ساختار دیتابیس و مدل مفهومی را تغییر دهیم.
» توسعه دهندگان (برنامه نویس ها ! 😀 ) قادرند تا با ساختار شیء گرایانه سازگار با انواع سیستم های مدیریت دیتا کار کنند.
» مرتبط شدن چندین مدل مفهومی به یک ساختا دیتابیس.
» پشتیبانی Language-integrated query (LINQ) موجب اعتبارسنجی عبارات پرس جو (Query) در حین کامپایل میشود.


p2 انتخاب بین L2S و EF

خیلی خلاصه طبقه بندی کردم:


question چه موقع از Linq to SQL استفاده خواهیم کرد؟


وقتی میخواهیم:



از یک
ORM استفاده کنیم  و دیتابیس ما در یک رابطه 1 به 1 با مدل اشیاء قرار دارد.


از یک
ORM که  ساختار سلسله مرتبی ای را که در یک جدول ذخیره شده است ارث بری کرده باشد.


استفاده از کلاس هایی که خودمون نوشتیم در کنار کلاس های تولید شده توسط سیستم  یا ارث بری از کلاس های پایه یا پیاده سازی اینترفیس ها در کلاس ها.


استفاده از
LINQ به عنوان ابزار Query نویسی


استفاده از یک
ORM با حفظ کارآیی و امکان بهبود آن از طریق Stored Procedure ها و Query های کامپایل شده.



question چه موقع از LINQ to Entity استفاده خواهیم کرد؟


وقتی میخواهیم:



وقتی میخواهیم برنامه ما به دیتابیس های دیگری به جز
Microsoft SQL Server  نیز دسترسی پیدا کند.


وقتی میخواهیم
domain models برای برنامه مان تعریف کنیم و از آن به عنوان لایه persistence استفاده نماییم.


استفاده از کلاس هایی که خودمون نوشتیم در کنار کلاس های تولید شده توسط سیستم  یا ارث بری از کلاس های پایه یا پیاده سازی اینترفیس ها در کلاس ها.


از یک راهکار
ORM ی استفاده کنیم که ممکن است کلاس هایمان رابطه ای 1:1 با دیتابیس داشته باشد یا ممکن است ساختاری بسیار متفاوت و پیچیده در ارتباط با دیتابیس دارا باشد.


می خواهیم از یک
ORM استفاده کنیم که ساختارهای سلسله مرتبی در آن معادل های دیتابیسی متفاوتی دارا باشد مانند وقتی که جدولی جهت نگهداری سلسله مراتب، جداولی برای هر یک از کلاس ها و جدولی جهت نگهداری گونه (Type)
خاص داریم.


وفتی میخواهیم از
LINQ جهت نوشت Query ها استفاده کنیم در حالیکه Query در دیتابیس به شیوه خاص و در سلطه سازنده آن عمل می کند
.


استفاده از یک
ORM با حفظ کارآیی و امکان بهبود آن از طریق Stored Procedure ها و Query های کامپایل شده.

 

question
چرا از Entity Framework استفاده کنیم؟

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

» EF  اجازه می دهد تا شما روابط چند به چند (n:n) را بدون join ها متعدد مدیریت نمایید.

» جهت کاهش پیچیدگی کد جداول مرتبط را در یک Entity مدل کنید.

» پشتیبانی قئی و خفن از ارث بری ها برای جدول به ازای سلسله مراتب، زیرکلاس (subclass) و تایپ های به هم چسبیده (concrete type).

» Consolidation برای اشیاء پیچیده بسیار ساده است.

» چون دارای مکانیسم بسیار قوی Query گیری از Entity هاست. کسانی که مایل با استفاده از LINQ  نیستند می توانند از  EntityClient provider  همرا با EntitySQL استفاده نمایند.

» میتوانید با استفاده از ADO.NET Data Services (Astoria). دیتای مدل شده خودتان را انتشار دهید.

» مستقل از نوع دیتابیس می باشد و بر اساس استاندارد ADO.NET Providers. کار می کند.

»  هم اکنون تعداد زیادی شرکت های دیگر provider هایی ارائه و پیشنهاد کرده اند مانند:

    * Devart جهت استفاده ازOracle, MySQL  و  PostgreSQL EF توصیه می شود.
    *  Phoenix Software Solutionجهت استفاده از SQLite  EF را توصیه می کند.
    * Npgsql برای استفاده از PostgreSQL  provider دیگری را توصیه کرده.
    *  OpenLink Software طیف وسیعی را جهت استفاده از for Oracle (versions 7.x to 11.x), Microsoft SQL Server (6.x to 2005), IBM DB2 , Sybase (4.2 to 12.x+), IBM Informix (5.x to 11.x), Ingres (6.4 to 9.x), Progress (7.x to 10.x), MySQL, PostgreSQL,  و Firebird  پیشنهاد کرده است.
    * Sybase SQL Anywhere  از SQL Anywhere پشتیبانی می نماید.
    * IBM پشتیبانی دیتابیس هایی مانند DB2, Informix  و U2  را خودش عهده گرفته است.

» بخش های دیگر زیادی به آن افزوده خواهد شد…


ee402630_blog_lg

 نتایج یک مقایسه بین Entity Framework و Subsonic

با اینکه Subsonic رو به لحاظ معماری خیلی قبول دارم ولی یه مقایسه ساده رو میزارم تا ببینید چقدر به لحاظ کارآیی Entity Framework سره:

تست ساده ایه که میتونم سورسش رو بزارم برای دانلود، ملاک اینجا زمان مورد نیاز جهت لود کردن مقادیر مختلفی از اطلاعاته:

Subsonic

Entity Framework

3937

1312

1906

140

1062

156

1078

140

1062

140

مقادیر به میلی ثانیه است

 

 

میبینید که Entity Framework نتیجه بسیار بهتری داره…

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

۱۹ دیدگاه دربارهٔ «Entity Framework یا Linq 2 SQL یا همون ADO.NET ؟;

  1. سلام استاد،خیلی خوشحالم که دوباره آپدیت می کنید و نوشتن رو شروع کردید.دلمون همnبرای شما تنگ شده و امیدوارم هر چه زودتر شما رو زیارت کنیم و از کلاس های علمی واخلاقی شما
    کسب فیض کنیم.براتون بهترین ها رو آرزو می کنم…

    پاسخ
  2. سلام جناب صباحی 🙂
    بسیار لذت بردم از پست شما 🙂
    وبلاگ بسیار مفیدتون به لیست Bookmark من اضافه شد.
    جناب صباحی لطفا در صورتی که وققتون اجازه می دهد سوالات من را پاسخ بدید یا لینکی برای اطلاعات بیشتر قرار دهید. ممنون
    ۱)ساختار سلسله مرتبه ای چه ساختاری هست؟
    ۲)Domain Model چه تفاوتی با Service Model دارد؟
    ۳)لایه ی persistence به چه معنا می باشد؟ من فقط اندکی با مفهوم این لایه در WorkFLow آشنا هستم.
    ۴) EF را در مقایسه با Nettiers (الگو ی تولید کد برای CodeSmith) چگونه می بینید؟
    ممنون 🙂

    پاسخ
  3. سلام
    ۱- از حسن نظر و توجهتون متشکرم
    ۲- ساختار سلسله مرتبی رو مانند گروه کالا در نظر بگیرید، مرحله اول کالا که در مرحله دوم به دو شاخه ی کالای الکترونیکی و یا کالای غیرالکترونیکی تقسیم میکنیم، کالای الکترونیکی را به قابل حمل و یا غیر قابل حمل و… به عنوان مثال دیگر می توان به چارت خانوادگی (پدر، پدربزرگ و نوه و بچه ها) که به صورت سلسله مراتبی قرار دارند… به طور خلاصه: اطلاعاتی که نسبت به یکدیگر رابطه ی والد و فرزندی دارند و تقدم تاخر آنها همانند صف نیست…

    ۳- Domain Model: در مباحث مهندسی نرم افزار به بیانی از اشیاء و روابط بین آنها در یک سیستم (چارچوب مرتبط به هم)گفته می شود.
    Service Model: نوعی معماری که مورداستفاده ساختارهای سرویس گرا (SOA) و یا چند لایه می تواند قرار گیرد و قادر به تبادل اشیاء به صورت سبک و مناسب برای تبادل محیا می سازد.

    پاسخ
  4. در صورتی که تفکیک ساختاری اشیا مدنظر باشد، استفاده همزمان از دو معماری توصیه میشه… دلایلش زیاده میشه در قالب یک پست بهش پرداخت.

    ۴- Persistence Layer: به کلاس هایی گفته می شود که با در برداشتن مفاهیم ارث بری، کپسوله سازی و … امور مورد نظر جهت کار با دیتابیس را دارا هستند، مثلا شما آبجکت (کلاس) دانشجو داریدکه دارای متدهایی برای افزودن، حذف، ویرایش و.. می باشد و شما تنها با صدا کردن آنها این امور را در دیتابیس انجام می دهید. عموما در این نوع معماری قالیت پشتیبانی از چند نوع دیتابیس نیز دیده میشود. به این صورت که شما با صرف نظر ازنوع دیتابیس فقط متد افزودن، حذف و.. را فراخوانی میکنید…
    ۵- خیلی سوال کلی ای پرسیدید، ولی هرکدوم مزایایی دارند… EF چندین نوع دیتابیس را پشتیبانی میکند و یا LINQ 2 Entity و یا بحث Forward, Backward Design و کلی چیز دیگه و خصوصا تکیه ی خود مایکروسافت از اون طرف NET Tiers. ساخت خودکار SP ها یا … بهتره مقایسه کنیم. البته من تو همسن بلاگ EF رو با چند فریم ورک دیگه مقایسه کردم…

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

    پاسخ
  5. جناب مصباحی جدا از حواب سریع و مفصلتون شرمنده شدم 🙂 جدا که درخت هر چه پر بار تر افتاده تر.
    ۴ پاسخ اول را کاملا متوجه شدم.
    و سوال آخر نیاز به باز کردن ییشتر دارد.
    در میان انبوه ORM ها
    llblgen Pro
    Codesmith (که ORM نیست؟!)
    .
    .
    .
    و مواردی که شما فرمودید.
    بنده به دلیل سازگاری Entity Framework با تکنولوژی های مختلف Microsoft و Design Pattern های آن مثل MVVM در WPF و Silverlight و توضیحات شما و مقایسه به جای شما شروع به یادگیری آن کرده ام هر چند تجربه ی استفاده از NEttiers و LINQ را دارا هستم.
    باز هم از حسن توجه شما متشکرم
    امیدوارم نسبت به نظرات و سوالات بنده درآینده کلافه (:P) نشوید 🙂

    پاسخ
  6. با سلام
    ممنون از مقاله پر بارتون راستش من توی یه شرکت کار میکردم که پروژه را باEF4 شروع کردند ولی متاسفانه این تکنولوژی باگ های زیادی داشت
    از جمله توی افزودنهای بالای ۱۰۰۰ تا هم زمان دچار مشکل میشد
    یا توی select ها که روی جدول های مختلف انجام میداد در بعضی مواقع روی محتوای داخل هر فیلد خطا میداد مثلا یه جدول که شامل شماره موبایل ها بود به شماره موبایل خاص گیر میداد
    و ما نتونستیم حلش کنیم
    حالا سوال من اینه که این تکنولوژِی که تا این حد امن نیست ایا واقعا قابلیت این که پروژه های بزرگ بر مبنای اون نوشت را دارد؟و یا شاید باگ های اون توی ورژن جدید برطرف شده
    ممنون میشم نظرتون بدید

    پاسخ
  7. سلام
    در این که هیچ نرم افزاری فاقد باگ نیست، شکی نیست، ولی موضوع اینه که مواردی که شما فرمودید خیلی بزرگ تر از باگ هست و قطعا دلیل جانبی دیگه ای داشته، از جمله مشکلات برنامه نویسی جانبی یا عدم اشراف فنی تیم معماری به EF و SQL سرور (قصد جسارت و یا توهین هرگز ندارم)، ولی چون در ایران EF یاد گرفتن به معنای بررسی چند مثال سایت CodeProject و یا code.msdn.com شده این رو عرض میکنم.
    خود من موقع تدریس با مقایسه EF با NH و یا فریم ورک های دیگه کاستی هایش رو بررسی می کنم ولی باگ با کاستی تفاوت داره.
    میتونیم بیشتر با مسئله شما آشنا شیم و انشالله مشکل رو حل کنیم که خاطره بدی از EF همراه نداشته باشید 🙂

    پاسخ
  8. سلام آقا
    من تازه با سایت شما آشنا شدم .خیلی هم خوشم آمد . از اینکه به سوالات هم با دقت جواب می دید خیلی خوشم اومد.
    الام یه چند وقتی هست که یه سوالی دارم و تو هر جا هم که شده سر زدم چیز زیادی دستتم نیومد.
    حالا سئالم اینه که فرق بین DLL و Com+ چیست ؟؟؟ از لحاظ تئوری می دونم این چیه و اون به چه دردی می خوره یه سمپل می خواستم که خودم یه سرویس کام تولید کنم و برم تو Componet های ویندوز بیبنم که ساخته شده است یا.
    بعدش هم من اینو نمی فهمم که وقتی می گن Com رابط شی هست و می تونه مثلا یه کلاس رو ارسال کنه یعنی چه؟؟؟ با DLL هم می شه یه تابعی نوشت که ورودیش مثلا یه DataTable باشه و خروجیش هم یه DataRow و غیره
    خیلی ممنون می شم که راهنمایی کنید.
    اومیدوارم که سوالمو فهمیده باشی و در ضمن سوالم چیپ نباشه.

    پاسخ
  9. سلام
    ۱: از حسن نظرتون سپاسگزارم، امیدوارم مفید واقع بشه.
    ۲: فرق DLL و +COM: مقایسه این دو شاید خیلی خوب نباشه، بنابراین بهتره COM و +COM رو بررسی کنیم: COM قابلیتی است که میشه به وسیله اون قابلیت هایی رو برای نرم افزارهای دیگه به اشتراک گذاشت، مثال: شما زمان زیادی صرف میکنید و محاسبات مربوط به مقاومت یک سازه رو برای مهندسین عمران کدنویسی میکنید {مجموعه ای از توابعی که کارهای محاسباتی رو انجام می دهند} این مجموعه دستورات رو در قالب یک فایل DLL ولی با تکنولوژی COM {فایل DLL برای تکنولوژی غیر COM نظیر NET. نیز قابل استفاده است} به یک شرکت ارائه میکنید، شرکت بر اساس توابع موجود در DLL شما رابط کاربری مینویسه و نرم افزار جدید از طریق UI خودش اطلاعات رو از کاربر میگیره و به DLL شما پاس میده و جوابش رو به صورت گرافیکی نمایش میده. به وسیله COM شما قادرید تا حتی تحت شبکه (نرم افزار روی کامپیوتر الف و DLL شما روی کامپیوتر ب) کار کند.
    +COM: مکمل امکانات COM در کنار Microsoft Transact Server است! یعنی چی؟ یعنی اینکه: شما علاوه بر امکانات COM قادرید تا تراکنش (transaction) هایی رو به اجرا در بیارید که روی چندین دیتابیس سرور که روی چند ماشین مجزا قرار گرفته اند. یا اینکه نرم افزارهایی بنویسید که در صورت قطع شدن ارتباط بتوانند به کارشون به صورت آفلاین ادامه بدهند و به وسیله MSMQ درخواست ها رو یه جا صف کنند تا بغد از برقراری مجدد ارتباط ارسالشون کنند.
    مثال مفید: http://www.codeproject.com/Articles/3845/Creating-COM-Objects-using-EnterpriseServices-in-N

    پاسخ
  10. با سلام دوباره و تشکر فراوان از اینکه جواب سوالمو دادید.
    امین جان من تا ایجاشو فهمیدم که من مثلا یه کتابخانه محاسبات پیچیده ریاضی (مثلا محاسبه ریشه انم یه عدد ، رادیکال یه عدد به پایه و مبنای ورودی از کاربر و غیره . . ) و این DLL رو می دیم به هر بنی بشری تا حالشو ببره .من تا اینجا فهمیدم ! ولی این کجاش از تکنولوژی COM استفاده می شه.؟؟؟؟!!!
    بعد جایی خوندم که Com , تکنولوژی است برای فراهم کردن رابط برنامه نویسی شی گرا ، و مستقل از زبان در سیستم عامل ویندوز تا از این طریق بخش های مختلف برنامه ها ، یا خود برنامه ها با هم بتونن ارتباط برقرار کنند.
    همچنین اینکه DLL قادر به ردوبدل کردن اشیا نیست ولی COM می تونه رابط برنامه نویسی شی گرا ارائه کنه.
    ممنون می شم اگر توضیح کاملتری بدی.

    پاسخ
  11. شما اگر طبق مستندات مربوط به COM کد مربوط به DLL تون رو تولید کنید میتونید DLL تولید شده توسط ++C را در اختیار یک دات نت کار یا یک دفی نویس بگذارید.
    ماجرای آبجکت هم اینه که شما داخل زبان شی گرایی مثل #C میتونید آبجکتی رو new کنید که کدش داخل یک DLL از نوع COM می باشد.

    پاسخ
  12. با سلام خدمت شما
    من از مطالبی که گذاشتید خیلی متشکرم
    اما من یه سوال داشتم
    من قبلا از ویژوال بیسیک شش استفاده میکردم حالا میخوام سوییچ کنم به سی شار پ یا وی بی دات نت
    اما موندم کدوم یکی رو برم و مساله مهمتر کار با بانک اطلاعاتی هستش من از اول کار اومدم سراغ EF اما چون راههای مختلف کار با بانک اطلاعاتی هستش عدای دارن میگن که سراغ این مدل نرو که بدرد نمیخوره حالا من سراغ کدوم زبان برنامه نویسی و کدوم مدل برنامه نویسی بانک اطلاعاتی برم
    با تشکر از مطالبتون

    پاسخ
  13. سلام. با تشکر از وبلاگ خوبتون…من طی بررسیهایی که داشتم نهایتا به این نتیجه رسیدم که برای انجام عملیات روی حجم زیاد دیتا استفاده از orm ی مثل EF خوب نیست و هیچی بهتر از ADO.net و صدا زدن خود SP ها نمیشه…شما موافقین؟
    ممنون

    پاسخ
  14. البته بستگی به شیوه ی بهره گیری از ORM داره، شما میتوانید SP هاتون رو از داخل ORM صدا بزنید.
    ولی درکل صحبت شما صحیح است، ORM ها هم مراحل بیشتری رو طی میکنند هم اینکه خودشون از ابزار های داخل ADO.NET استفاده میکنند.
    یک موازنه بین تسهیل و تسریع توسعه و کارآیی باید برقرار بشه. مثال: در راهکارهایی که سرعت خیلی زیاد لازمه و مدل ها ساده هستند (مانند سوییچ پرداخت بانک) عمومن از ORM فرار میکنیم…

    پاسخ
  15. سلام دوست من.
    دوست عزیز سوالی بود که خیلی وقته ذهنم رو مشغول کرده و به دلیل مشغله زیاد نتونستم تحقیق کنم.
    جسارتا بنده هم EF رو بیشتر دوست دارم خوب قطعا برای بنده که تخصص کاملی ندارم به خاطر راحت تر بودن کد نویسیش هست اما همیشه برام سوال بوده که مثلا دستورات EF رو که مینویسیم در انتها باید به SQL تبدیل بشن پس یک مرحله بیشتر از SQL داره کار انجام میده در این صورت سرعت SQL نباید بیشتر باشه؟
    ساده تر بپرسم فکر کنم بهتر باشه، مثلا من میخوام رکوردهای یک جدول رو واکشی کنم.
    وقتی از ADO.NET استفاده میکنم مستقیم کوئری خودم رو مینویسم و روی دیتابیسم اجرا میشه و نتایج رو میبینم
    حالا اگر با EF بنویسیم اول کوئریی که نوشتم باید به کوئری SQL تبدیل بشه بعد روی SLQ Server اجرا بشه و نتایج رو ببینم
    در این صورت سرعت ADO.NET بیشتر نمیشه؟

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

    پاسخ

دیدگاهتان را بنویسید