كيفية حذف جميع بيانات قاعدة البيانات باستخدام NHibernate؟

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

سؤال

هل من الممكن حذف جميع البيانات الموجودة في قاعدة البيانات باستخدام NHibernate.أريد أن أفعل ذلك قبل البدء في اختبار كل وحدة.أقوم حاليًا بإسقاط قاعدة البيانات الخاصة بي وإنشائها مرة أخرى ولكن هذا ليس حلاً مقبولاً بالنسبة لي.

==========================================================

حسنًا، ها هي النتائج.أقوم باختبار هذا على قاعدة بيانات (Postgre).سأقوم باختبار CreateSchema(1) وحل DanP(2) وحل apollodude217(3).أقوم بإجراء الاختبارات 5 مرات بكل طريقة وأستغرق متوسط ​​الوقت.

الجولة 1 - 10 اختبارات
(1) - ~26 ثانية
(2) - 9,0 ثانية
(3) - 9,3 ثانية

الجولة الثانية - 100 اختبار
(1) - هيا، لن أفعل ذلك على جهازي
(2) - 12,6 ثانية
(3) - 18,6 ثانية

أعتقد أنه ليس من الضروري الاختبار بمزيد من الاختبارات.

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

المحلول

شخصيا، يمكنني استخدام إجراء مخزن للقيام بذلك، ولكن قد يكون من الممكن مع HQL القابل للتنفيذ (انظر هذا المنشور لمزيد من التفاصيل: http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html )

شيء على غرار session.delete ("من الكائن")؛

نصائح أخرى

أنا أستخدم SchemaExport فئة وإعادة إنشاء المخطط قبل كل اختبار.وهذا يشبه تقريبًا إسقاط قاعدة البيانات، لكنه يؤدي فقط إلى إسقاط الجداول وإعادة إنشائها.أفترض أن حذف جميع البيانات من كل جدول ليس أسرع من ذلك، بل قد يكون أبطأ.

عادةً ما يتم تشغيل اختبارات الوحدة الخاصة بنا على Sqlite في الذاكرة، وهذا سريع جدًا.قاعدة البيانات هذه موجودة فقط طالما أن الاتصال مفتوح، لذلك يتم إعادة إنشاء قاعدة البيانات بأكملها لكل اختبار.نحن نتحول إلى Sqlserver عن طريق تغيير تكوين البناء.

أنا لا أدعي أن هذا أسرع، ولكن يمكنك القيام بشيء من هذا القبيل لكل فئة معينة:

giveacodicetagpre.

هذا (وحده) سوف ليس العمل في حالات 2 على الأقل:

  1. عندما تكون هناك بيانات يجب أن تكون في قاعدة البيانات الخاصة بك عندما يبدأ التطبيق.
  2. عندما يكون لديك نوع حيث القيمة غير المحفوظة في خاصية الهوية هي "أي".

بديل جيد هو تناول نسخة احتياطية من حالة DB الأولي واستعادةها عند بدء الاختبارات (قد يكون هذا معقدا أم لا، اعتمادا على DB)

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

البديل سيكون لكتابة برنامج نصي من شأنه أن يسقط جميع المفاتيح الأجنبية في قاعدة البيانات ثم حذف / اقتطاع جميع الجداول.لن يؤدي هذا إلى إعادة تعيين أي معرفات أو تسلسل ذاتي.هذا لا يبدو وكأنه حل أنيق وهو بالتأكيد أكثر استهلاكا للوقت. على أي حال، هذا ليس شيئا يجب القيام به من خلال orm، وليس فقط lhibernate.

لماذا ترفض خيار إعادة إنشاء؟ما هي الاحتياجات الخاصة بك؟هل المخطط معقد للغاية؟هل يقوم شخص آخر بتصميم قاعدة البيانات؟هل تريد تجنب تجزئة الملفات؟

قد يكون حل آخر إنشاء إجراء مخزن يمسح البيانات.في إعداد الاختبار الخاص بك أو إنشاء طريقة إنشاء الإجراء المخزن أولا.

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

hth

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