C# Linq-to-Sql - هل يجب التخلص من DataContext باستخدام IDisposable

StackOverflow https://stackoverflow.com/questions/821574

سؤال

لدي عدة طرق للتعامل مع قاعدة البيانات وكلها تبدأ بالاتصال

FaierDbDataContext db = new FaierDbDataContext();

نظرًا لأن كائن Linq2Sql DataContext يطبق IDisposable، فهل يجب استخدام هذا مع "استخدام"؟

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

وما هي الآثار المترتبة على استخدامه بطريقة أو بأخرى؟

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

المحلول

على عكس معظم الأنواع التي تنفذ idisposable ، لا يحتاج DataContext حقًا إلى التخلص - على الأقل ليس في معظم الحالات.سألت مات وارن عن قرار التصميم هذا ، وهنا كان رده:

هناك بعض الأسباب التي قمنا بتنفيذ idisposable:

  • إذا احتاج منطق التطبيق إلى التمسك بكيان يتجاوز عندما من المتوقع استخدام DataContext أو ساري المفعول ، فيمكنك فرض هذا العقد عن طريق الاتصال بالتخلص.سيظل اللوادر المؤجلة في هذا الكيان يشير إلى DataContext وسيحاول استخدامه إذا حاول أي رمز التنقل في الخصائص المؤجلة.سوف تفشل هذه المحاولات.تخلص أيضًا من DataContext لتفريغ ذاكرة التخزين المؤقت الخاصة بالكيانات المسلحة بحيث لا يحتفظ كيان واحد مخبأة عن طريق الخطأ بجميع الكيانات التي تتحقق من خلال هذا النص ، مما قد يتسبب في ما يبدو أنه تسرب للذاكرة.
  • يمكن خداع المنطق الذي يغلق اتصال DataContext تلقائيًا في ترك الاتصال مفتوحًا.يعتمد DataContext على رمز التطبيق الذي يعدد جميع نتائج الاستعلام منذ الوصول إلى نهاية مجموعة النتائج يؤدي إلى إغلاق الاتصال.إذا كان التطبيق يستخدم طريقة movenext الخاصة بـ ienumerable بدلاً من عبارة foreach في C# أو VB ، فيمكنك الخروج من التعداد قبل الأوان.إذا واجهت تطبيقك مشاكل مع الاتصالات التي لا تغلق واشتبه في أن سلوك الإغلاق التلقائي لا يعمل ، فيمكنك استخدام نمط التخلص من العمل.

من مصدر

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