خطایی رایج در توسعه افزونه‌های Microsoft CRM

یکی از قابلیت‌های ویژه Microsoft CRM امکان توسعه و ثبت افزونه‌ها برای آن است. افزونه‌ها امکان اضافه نمودن Businessهای جدید و اتصال به Web Serviceهای مفید را امکان‌پذیر می‌سازند. یکی از خطاهای رایج در توسعه افزونه‌ها، خطایی است که امروز به آن خواهیم پرداخت.

The context is not currently tracking the "..." entity

فرض کنید کدی سفارشی به شکل زیر در اختیار دارید:

 

Guid ActorGUID = ( from c in xrm.ContactSet where c.FullName == "Payman" select c.Id).FirstOrDefault();

Xrm2011.Contact Actor = new Xrm2011.Contact {

      Id = ActorGUID,

      DoNotEmail = true

};

xrm.UpdateObject(Actor);

xrm.SaveChanges();

 
کد بالا جهت جستجوی شخصی با نام مشخص است که از ادامه آن جهت تنظیمات ایمیل می‌توان استفاده نمود. استفاده از افزونه با شکل فعلی آن ما را با خطای ذکر شده مواجه خواهد نمود. دلیل این مشکل چیست؟
1- Linq Query استفاده شده در ابتدا، شخص دلخواه را جستجو می‌نماید. در این حالت تا زمانی که مشخص نشود، context به track کردن آن موجودیت ادامه خواهد داد. این باعث می‌شود که تغییرات انجام شده بر روی آن قابل پیگیری و ثبت باشد.
2-  در مرحله بعد، به دنبال این هستیم که شخصی با مشخصات دلخواه ایجاد نماییم.
3- استفاده از SaveChanges باعث می‌شود که با خطا مواجه شویم. زیرا context هنوز موجودیت قبلی را دنبال می‌نماید، درحالی‌که ما به دنبال ذخیره موجودیت جدید هستیم.
برای رفع مشکل بایستی context از موجودیت قبلی جدا شده و به موجودیت جدید وصل شود. پس همواره مراحل زیر را در استفاده از context مدنظر خواهیم داشت:
  • نگهداری reference موجودیت اصلی.
  • جدا کردن context از آن.
  • اتصال context به موجودیت جدید.
  • به روزآوری موجودیت جدید.
  • ذخیره تغییرات اعمال شده.

در نهایت کدی که به درستی استفاده خواهد شد به شکل زیر است:

 

Guid ActorGUID = ( from c in xrm.ContactSet where c.FullName == "Payman" select c.Id).FirstOrDefault();

xrm.ClearChanges();

Xrm2011.Contact Actor = new Xrm2011.Contact {

      Id = ActorGUID,

      DoNotEmail = true

};

xrm.Attach(Actor);

xrm.UpdateObject(Actor);

xrm.SaveChanges();

 

نظرات
  1. علیرضا خراسانی 19:51 روز 31 خرداد

    tashakkor babate zahamate jenabeali dar anjoman