عنوان:

‫تغییر استراتژی ساخت مدل در EF5 و رفع مشکل WCF Ria


نویسنده: حسین مرادی نیا
تاریخ: ۱۳۹۱/۰۹/۳۰ ۱۹:۷
آدرس: www.dntips.ir
Entity framework 5 نسبت به نسخه‌های پیشین شاهد تغییرات بسیاری بوده است و مانند هر تغییر دیگری اینجا نیز ممکن است تغییرات ؛ باعث بروز مشکلاتی در روند توسعه نرم افزار شوند. EF در نسخه جدید خود در کدهای پشت صحنه Model به جای ObjectContext از DbContext که نسخه محدود شده ObjectContext می‌باشد استفاده می‌کند. همین امر به خودی خود باعث محدود شدن متدهای شئی Context شده است. متدها و خواصی که گاها برای انجام اعمال خاصی به آنها نیاز پیدا می‌کنیم ولی دیگر در دسترس نیستند. برای مثال برای یک برنامه خاص می‌خواستم مقدار CommandTimeout   را به صورت دستی برای شئی Context تنظیم کنم ؛ ولی کد زیر دیگر قابل استفاده نبود:
  context.CommandTimeout = 180;
همچنین این استفاده از DbContext در هنگام استفاده از WCF Ria در سیلورلایت باعث بروز مشکل شده و کلاس‌های مدل در هنگام تعریف Domain Service Class توسط WCF Ria قابل شناسایی نیستند.یعنی WCF RIA به صورت خودکار قادر به تشخیص کلاس‌های Model نمی‌باشد.
 

برای رفع این مشکل مراحل زیر را انجام دهید:

  1. دو فایل tt موجود در مدل را حذف نمایید.

 2. مدل را در حالت Designer باز کنید و در بخش خصوصیات مدل مقدار Code Generation Strategy را از None  به Default تغییر دهید.

3. پروژه را Rebuild نمایید. مشکل به همین سادگی رفع می‌شود.
حالا با خیال راحت می‌توانید کلاس‌های مدل را در پنجره Add New Domain Service Class مشاهده نمایید.
 

نظرات

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

    سلام، از به روز رسانی جدید ria services استفاده می‌کنید؟

    dbcontext در code first هست. شما از db first استفاده کردید؟

    این مدل‌ها قبلا هم ظاهر نمی‌شدند. یعنی چون بر اساس reflection کار می‌کند برنامه یکبار باید کامپایل شود.

    • حسین مرادی نیا در ۱۳۹۱/۰۹/۳۰ ۱۹:۲۴
      خیر
      از این به روز رسانی استفاده نکردم.
      این مورد برای حالت Database First ذکر شده و مشکل به این روش حل می‌شود.
      کنجکاو شدم بدونم که این مشکل در این به روز رسانی حل شده یا نه! اگر کسی استفاده کرده به ما هم بگه.
  • مهمان در ۱۳۹۱/۰۹/۳۰ ۱۹:۲۴
    در code first هم میشه به object context دسترسی پیدا کرد:
    public class YourContext : DbContext
    {
      public YourContext()
        : base(".......ConnectionString...........")
      {
        // ObjectContext of DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = 120;
      }
    }
  • ناصر فرجی در ۱۳۹۲/۰۱/۱۵ ۱۷:۵۰
    این مشکل توی یک پروژه جدید با vs 2012 کلی وقت من رو هدر داد! بلاخره هم به صورت شانسی حلش کردم. کاش زودتر این مطلب رو دیده بودم :)
    • مهمان در ۱۳۹۲/۰۱/۱۹ ۱۰:۲۱
      راه حل ارائه شده باعث می‌شه که شما قابلیتهای  DBContext رو از دست بدهید و با همون اشیاء Object Context کار کنید . در این حالت دیگه فکر نکنم استفاده از EF5 ضرورتی داشته باشه.
      راه حل صحیح اینه که RiaServices.EntityFrameWork را با استفاده از Manage Neget Pakages رو نصب بفرمائید تا Ria service بتونه اشیاء DbContext رو هم ساپورت کنه.
      شاد و پیروز باشید.
      • محسن خان در ۱۳۹۲/۰۱/۱۹ ۱۳:۲
        DbContext مطابق کدی که چند سطر بالاتر نوشته شده فقط یک Wrapper است برای ObjectContext. چیز جدیدی این وسط اختراع نشده. گل همان گل است.
        • مهمان در ۱۳۹۲/۰۱/۱۹ ۱۳:۱۳
          منظور از اختراع نمی‌دونم چیه؟ ولی DBContext دارای قابلیت  های اضافی بسیاری نسبت به ObjectContext هست . مثل تابع Find و ..... 
          بله حرف شما متین هست و DbContext از ObjectContext ارث می‌بره.
          شاد و پیروز باشید
      • ناصر فرجی در ۱۳۹۲/۰۱/۲۱ ۱۳:۴۹
        میشه بگید توی یک برنامه asp.net ساده که توی vs2012 نوشته شده راه حل چیه؟ چون در صورتی که Code Generation Strategy  رو تغییر ندیم دیگه به مدل دسترسی نداریم؟ (روش database first) 
        • محسن خان در ۱۳۹۲/۰۱/۲۱ ۱۳:۵۹

          روش database first همان روش استفاده مستقیم از ObjectContext است.

          ضمنا چرا در یک برنامه ASP.NET از RIA Services استفاده کردید؟ RIA Services بهینه شده برای استفاده در Silverlight و فناوری‌های مانند اون.

          • ناصر فرجی در ۱۳۹۲/۰۱/۲۱ ۱۴:۴
            بنده از  RIA Services استفاده نکردم. در vs2012 هنگام کار با asp.net web forms شما به صورت پیش فرض هنگامی که یک مدل رو به برنامه اضافه می‌کنید به مدل توی کلاس‌ها و فرم‌ها دسترسی نداردید. تنها راه اینه که برید  Code Generation Strategy رو از none به default تغییر بدید تا برنامه به درستی کار بکنه و بتونید مدل رو توی namespace‌ها داشته باشید. میخاستم ببینم این کاری که من انجام میدم درسته یا باید راه دیگه ای رو انجام بدم؟