عنوان:

‫دوراهی انتخاب NHibernate و Entityframework


نویسنده: مهدی پایروند
تاریخ: ۱۳۹۱/۰۹/۱۲ ۱۲:۳۲
آدرس: www.dntips.ir
من هم مثل خیلی از توسعه دهنده‌ها در انتخاب یک ORM از بین EF و NH بر سر دوراهی مانده ام.


مشاهده مطلب اصلی

نظرات

  • یاسر مرادی در ۱۳۹۱/۰۹/۱۲ ۱۲:۵۷
    مطلب مال سالها پیش هستش

    تنها چیزی که اهمیت داره Separation of concerns هستش
    موفق باشید 
  • وحید نصیری در ۱۳۹۱/۰۹/۱۲ ۱۳:۳۷
    استفاده از NH در مقابل EF Code first سورس باز اشتباه است؛ به دلایل زیر:
    - توهم پشتیبانی از بانک‌های اطلاعاتی مختلف توسط NH . به شخصه با حداقل یک مورد نیم بند آن سروکار داشتم: SQL-CE. تقریبا بیشتر از نیمی از توانایی‌های این بانک اطلاعاتی در NH لحاظ نشده و حتی یک کوئری ساده از تاریخ تا تاریخ را توسط آن نمی‌توانید تهیه کنید. این مورد برعکس EF Code first است. کامل و بی‌نقص کار می‌کند. کلا تمام محصولات مایکروسافت به همین نحو هستند. اگر عنوان می‌کنند این محصول دو قابلیت دارد، واقعا این دو قابلیت، درست کار می‌کنند. نه اینکه عنوان کنند 100 قابلیت را ارائه می‌دهیم و فقط 10 تای آن کامل پیاده سازی شده باشند.
    - تیم مدیریتی به شدت مغرور و ناراحت NH. باز هم برای این تیم ناراحت، جهت تکمیل نقایص کار با SQL-CE بیشتر از یکسال قبل وصله‌ای رو ارسال کردم. تا به امروز حتی یک پاسخ که آیا خوبه، بده ... ارسال نشده. با اکثر همکاری‌ها هم به همین نحو رفتار می‌کنند.
    خلاصه حال و هوای یک پروژه سالم سورس باز را ندارد.
    - پس از ارائه EF Code first این پروژه تقریبا غیرفعال شده: (^)
    - نیم بند بودن پشتیبانی از LINQ. باز هم اگر تصور می‌کنید که راحت می‌تونید مثل EF از کوئری‌های LINQ در اینجا استفاده کنید، سخت در اشتباه هستید.
    - دیر به روز شدن کتابخانه‌های جانبی آن. این مساله هم به مدیریت بد پروژه NH بر می‌گردد. شاید بیشتر از 10 مورد افزونه برای NH هست، مانند کش و اعتبار سنجی و غیره. اما ... صاحبان آن مشخص نیستند! امروز NH3 ارائه می‌شود، سه ماه بعد کتابخانه اعتبارسنجی متناظر با آن. تیم NH هم حاضر نشده تمام این‌ها رو کنار هم قرار بده و یک کار یکپارچه رو ارائه کنه. NH اعتبار خودش رو از این افزونه‌های موجود در NH Contrib کسب می‌کنه، اما حاضر نیستند مدیریت و نگهداری یکپارچه آن‌ها را قبول کنند.
    - ناسازگاری با اکوسیستم دات نت. اگر از NH استفاده کنید مدام در حال جنگ با دات نت هستید. مثلا سیستم اعتبار سنجی EF با سیستم اعتبار سنجی سمت کلاینت و سرور MVC یکپارچه است. با NH اینطور نیست و از این نوع مثال‌ها زیاد است. همین مساله حجم کاری شما را چندبرابر می‌کند.
    - طراحی زمخت NH در مقابل طراحی روان EF. برای مثال در EF Code first شما به ندرت نیاز خواهید داشت که نگاشت‌ها را تعریف یا حتی سفارشی سازی کنید. یک سری پیش فرض بسیار عالی در آن به صورت توکار (و نه به شکل افزونه) وجود دارد که حجم کاری شما را به شدت کاهش می‌دهند. در NH کتابخانه fluent nh سعی کرده که اینکار را انجام دهد اما جالب اینجا است که این کتابخانه از طرف تیم اصلی NH اصلا تحویل گرفته نشده و ... دست آخر هم یک روش دیگر را برای نوشتن نگاشت‌ها با کد تهیه کردند.
    - مستندات NH کامل نیست. برای مثال شاید یک سری بلاگ‌های متفرقه را پیدا کنید که در مورد روش تهیه نگاشت‌ها با کد مطلب نوشته باشند ... نه توسط کسانی که این کتابخانه را تهیه کرده‌اند! این روند رو مقایسه کنید با وبلاگ EF مثلا : (^) این بلاگ تا این حد کامل است که مرجع بسیاری از مطالب آموزشی و کتاب‌های مرتبط با EF می‌باشد.
    - سیستم migration موجود در EF Code first نسبت به نمونه NH بسیار کاملتر است؛ با قابلیت سفارشی سازی، مقایسه هش مدل‌ها با جداول جهت جلوگیری از تداخلات و اشتباهات، تولید اسکریپت آپدیت بانک اطلاعاتی و غیره.

    یک زمانی بود دات نت ORM قابل ملاحظه‌ای نداشت. زمان دات نت2. در آن موقع NH حرف برای گفتن داشت اما ... نه الان.
    • مهدی پایروند در ۱۳۹۱/۰۹/۱۲ ۱۳:۴۲
      رای من 5 است *****

      پ.ن: ولی با این تفاوت که با به بلوغ رسیدن ORM هایی مثل NHi مایکروسافت هم زحمت ایجاد و تکمیل رو بخودش داده.
    • مهمان در ۱۳۹۱/۰۹/۱۲ ۱۸:۳۸
      سلام
      آقای نصیری چرا EF CodeFirst خیلی بیشتر از سایر مدلها (datafirst , model first) مورد توجه هست؟
      آیا درست هست که با استفاده از EF (به جای data set یا sqlconnection , ...) کمی performance پایین خواهد آمد؟
      • وحید نصیری در ۱۳۹۱/۰۹/۱۲ ۱۹:۲
        1 - با EF Code first بدون نیاز به دیتابیس می‌تونید یک برنامه رو کامل کنید. (منهای بحث آزمایش)
        - کد نهایی تمیزتر. چون کلاس‌ها را خودتان طراحی می‌کنید و توسط ابزارها به صورت خودکار تولید نمی‌شوند، کنترل بیشتر و نهایتا کیفیت بالاتری دارند.
        - ساده است. درگیر نگهداری edmx modelها نخواهید بود. به روز رسانی بانک اطلاعاتی آن هم می‌تواند کاملا خودکار شود.
         
        2 - دیتاست که کلا کارآیی بالایی نداره. اما ... نهایتا مطمئن هستم خروجی EF (به همراه تمام best practices لحاظ شده در آن) سرعت بالاتری از کلاس‌های دست ساز sql helper موجود در وب دارد. برای مثال سطح اول کش آن خیلی از کوئری‌ها را مجددا به بانک اطلاعاتی ارسال نمی‌کند. قابلیت اجرای به تعویق افتاده کوئری‌های لینک امکان تهیه کوئری‌های بسیار پیچیده را در یک رفت و برگشت مهیا می‌کند. کاری که با sql helperهای معمولی نیازی به چندبار رفت و برگشت دارد. قابلیت‌های lazy loading آن می‌تواند مصرف حافظه و بار سرور را درصورت استفاده صحیح کاهش دهد. کوئری‌های آن strongly typed و پارامتری هستند (تحت نظر کامپایلر + امنیت + سرعت (کوئری‌های پارامتری مانند رویه‌های ذخیره شده کش می‌شوند)). به صورت پیش فرض از تراکنش‌ها استفاده می‌کند و ... خیلی از الگوهای مفید دیگر که چندین سال باید وقت صرف کنید تا نمونه آن‌ها را پیاده سازی کنید. یعنی کار اصولی با بانک اطلاعاتی صرفا یک select ساده نیست که بر اساس آن کارآیی و یا بهتر بودن روشی را مشخص کنید.
        • رحمت اله رضایی در ۱۳۹۱/۰۹/۱۲ ۲۰:۵۸
          استفاده از EF برای ارتباط با Oracle واقعا عذاب آور است.
          در یکی از پروژه‌ها که بانک اطلاعاتی oracle و نرم افزار asp.net بود مجبور شدیم از همان sqlHelper‌ها استفاده کنیم. حتی در یک برنامه تستی برای یک select ساده از یک جدول با یک میلیون رکورد تفاوت فاحشی بین ado.net و EF5 وجود داشت (100 میلی ثانیه در مقابل 2 ثانیه با رعایت Initialize‌های EF در حالی که خروجی EF در پروفایلر هم همان کوئری بود).

          • وحید نصیری در ۱۳۹۱/۰۹/۱۲ ۲۱:۷
            مشکل عمومی در بین برنامه نویس‌ها وجود دارد و آن هم این است که فکر می‌کنند آنی که سریع‌تر است بهتر است. خیر! در ADO.NET خام تمام مسایلی که توضیح دادم مانند کش، ترجمه کوئری، نگاشت‌ها و رعایت بسیاری از best practices که در EF لحاظ شده، وجود ندارند. 50 قسمتی مطلب در موردش در سایت هست. در طول زمان همین کلاس‌های sql helper برای لحاظ این الگوها باید تغییر کنند و اینجا است که دست آخر به این نتیجه خواهید رسید، EF از تمام کارهای دست ساز بسیاری از برنامه نویس‌ها، سریعتر و بهینه‌تر است.
            کار اصولی با بانک اطلاعاتی صرفا یک select ساده نیست که بر اساس آن کارآیی و یا بهتر بودن روشی را مشخص کنید. 
          • مهدی پایروند در ۱۳۹۱/۰۹/۱۲ ۲۲:۱۸
            اتفاقا یکی از دوستان که پروژه ای با این مشخصات رو داره نگهداری میکنه در مورد استفاده از اوراکل با استفاده از EF تستهایی رو انجام داده و برای مهاجرت از یه لایه پر از دردسر و خطا آماده شده ولی حجم پروژه اجازه سریع این حرکت رو از ایشون گرفته.
  • مهمان در ۱۳۹۱/۰۹/۱۲ ۱۵:۷
    من برای سویچ از NH به EF حداقل دو مشکل عمده دارم:
    1. تجربه چند ساله در استفاده از NH و سورس‌های کدهای موجود با NH
    2. ترس از تکیه کامل به محصولات فقط یک شرکت (حالا هر شرکتی). البته قبول دارم که همین الان هم همه زندگی ابزارها و روش‌ها و غیره با همین یک شرکت است ولی...

    EF یک مزیت بسیار بزرگ نسبت به NH دارد آن هم تعداد برنامه‌نویس‌های خیلی بیشتر آن است. الان EF واقعا فراگیر شده است.

    این نکته هم نباید فراموش شود که در خیلی از کاربردها هیچ وقت نه به سقف محدودیت‌های EF می‌رسید نه NH.

  • مهمان در ۱۳۹۱/۰۹/۲۶ ۱۳:۵۴

    ما یک نرم افزار تقریبا بزرگ داریم که قبلا تحت ویندوز نوشته شده.حالا می‌خواهیم تحت وب هم ایجاد کنیم(c#).دیتابیس sql2005  است دیتابیس هم قرار نیست که تغییر کند  چند تا سوال داشتم چون نمیدونم از orm استفاده کنم یا sql queries !

    در صورتی کوئری‌های پیچیده داشته باشیم باز هم میشود از orm استفاده کرد؟

    سرعت واکشی اطلاعات به چه صورت است؟یعنی به ازای هر select به دیتابیس connectin میزند؟

    • مهمان در ۱۳۹۱/۰۹/۲۶ ۱۴:۲۷

      شما هنوز از ie 8 استفاده می‌کنید؟!

      نویسندگان این سایت که قرار نیست برای همه بیان بگن مثلا می‌تونی کوئری‌های لینک رو با تاخیر اجرا کنی. مثلا deferred execution هم وجود داره برای ترکیب چند کوئری با هم. یا این کوئری‌ها همشون پارامتری هستند و مثل رویه‌های ذخیره شده کش میشن. 

    • مهدی پایروند در ۱۳۹۱/۰۹/۲۶ ۱۵:۴
      برای تحت وب هم بهتون پیشنهاد میکتن که با ASP.NET MVC شروع کنید که سازگاری خوبی با ORM مایکروسافت یعنی Entityframewrok (آشنایی کاربردی با Entityframework )داره و برای شروع مطالب مربوط به ASP.NET MVC در وبسایت و بعد هم برای آشنایی بیشتر و ریز جزئیات بهترین کتاب فارسی ASP.NET MVC در حال حاضر که ترجمه|تالیف آقای مهندس راد هست که خود من هم تهیه کردم کمک بگیرید. البته الگوهای طراحی رو هم در نظر داشته باشید که برای آشنایی باز هم مطالب مربوط به آشنایی با الگوهای طراحی در همین سایت و کتابی که خدمتتون عرض شد، اشاره شده است.
  • وحید نصیری در ۱۳۹۲/۰۳/۳۰ ۲۳:۳۶