سؤال

كان هناك العديد من الأسئلة حول الإدارة entityContext أوقات الحياة،

على سبيل المثال إنشاء سياق في LINQ إلى الكيانات

لقد توصلت إلى استنتاج مفاده أن سياق الكيان يجب اعتباره وحدة عمل وبالتالي لا يتم إعادة استخدامه. عظيم.

لكن أثناء إجراء بعض الأبحاث لتسريع الوصول إلى قاعدة البيانات الخاصة بي ، واجهت منشور المدونة هذا ...

تحسين أداء إطار الكيان

يجادل المنشور بأن الأداء الضعيف EFS مقارنة بالأطر الأخرى يرجع إلى entityConnection يجري إنشاء الكائن في كل مرة جديدة entityContext هناك حاجة إلى الكائن.

لاختبار هذا ، قمت بإنشاء ContityConnection ثابتة يدويًا Global.asax.cs application_start ().

ثم قمت بتحويل كل سياقاتي استخدام بيانات ل

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

يبدو أن هذا قد انطلق الأمور قليلاً دون أي أخطاء بقدر ما أستطيع أن أقول.

لكن هل هذا آمن؟

هل استخدام ثابت على مستوى entityConnection تقديم ظروف السباق؟

مع أطيب التحيات ، كيرفين

هل كانت مفيدة؟

المحلول

تم توثيق ContityConnection ليكون غير آمن لخيط. أعتقد أنه يمكنك تجميعها ، لكن لا يمكنك استخدام اتصال واحد ثابت لتطبيق الويب ، حيث سيكون هناك العديد من المواضيع المعنية.

نصائح أخرى

  • إذا كان سياق EF الخاص بك على مستوى التطبيق ، ففكر في أن المستخدم A قام بإجراء تغييرات (غير ملتزم) وقد ارتكب المستخدم B تغييراته ، وسوف تلتزم جميع التغييرات بقاعدة البيانات لأن كل من المستخدم A & B يستخدمان نفس الحالة

  • في مشروعي ، قمت بعمل نية لكل WebRequest لسياق EF - أي. يكون كائن السياق ثابتًا من البداية حتى نهاية طلب الويب وجميع العمليات في هذا الطلب تعمل مع نفس سياق EF. وقد أسرع هذا بشكل كبير معالجتي دون المشكلة المذكورة أعلاه.

طريقة واحدة لتنفيذ ذلك هي استخدام حاوية DI (أنا أستخدم الوحدة) لإدارة عمر سياق EF. لم يتم إعطاء مديرة Lifetime Manager لكل طلب ويب خارج الصندوق في الوحدة ، ولكن هناك الكثير من المقالات التي توضح كيف يمكن القيام بذلك.

HTH.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top