المسارات
/
C#
C#
/
التمارين
/
الربط الكائني العلائقي
الربط الكائني العلائقي

الربط الكائني العلائقي

تمرين تعلّمي

مقدمة

تنظيف الموارد

إذا كان صنفٌ ما يُنفّذ الواجهة IDisposable، فيجب استدعاء طريقة Dispose() الخاصة به كلما لم تعد هناك حاجة إلى نسخة منه. ويُفعَل هذا عادةً من عبارة catch أو finally، أو من إجراء Dispose() لدى أحد المستدعين. وتوفّر طريقة Dispose() فرصةً لتحرير الموارد غير المُدارة مثل كائنات نظام التشغيل (التي لا تديرها بيئة تشغيل .NET) ولإعادة تعيين الحالة الداخلية للموارد المُدارة.

التعليمات

أنت تنفّذ نظام ORM (ربط الكائنات بالعلاقات) فوق قاعدة بيانات وفّرها فريق آخر.

تستطيع قاعدة البيانات التعامل مع معاملة واحدة في كل مرة.

لا حاجة في هذه المرحلة إلى تسجيل الأحداث أو أي معالجة أخرى للأخطاء.

لاحظ أن قاعدة البيانات تمرّ داخليًا بعدد من الحالات: Closed وTransactionStarted وDataWritten وInvalid وClosed. يمكنك الاعتماد على أن قاعدة البيانات تكون في حالة Closed عند بداية كل تمرين.

تحتوي قاعدة البيانات على طرق المثيل التالية:

  • تبدأ Database.BeginTransaction() معاملة على قاعدة البيانات. إذا استُدعيت بينما قاعدة البيانات ليست في حالة Closed فسيُطرح استثناء. وإذا نجحت فستتغيّر الحالة الداخلية لقاعدة البيانات إلى TransactionStarted.
  • تكتب Database.Write(string data) بيانات إلى قاعدة البيانات ضمن المعاملة. إذا استلمت بيانات غير صالحة فسيُطرح استثناء. ومحاولة استدعاء هذه الطريقة دون أن تكون BeginTransaction() قد استُدعيت ستؤدي إلى طرح استثناء. وإذا نجحت فستتغيّر الحالة الداخلية لقاعدة البيانات إلى DataWritten.
  • تُثبّت Database.EndTransaction() المعاملة في قاعدة البيانات. وقد تطرح استثناءً إذا لم تستطع إغلاق المعاملة أو إذا لم تكن Database.BeginTransaction() قد استُدعيت.
  • يؤدي استدعاء Database.Dispose() إلى تنظيف قاعدة البيانات إذا طُرح استثناء أثناء معاملة. وسيغيّر هذا حالة قاعدة البيانات إلى Closed.

يمكن الوصول إلى حالة قاعدة البيانات باستخدام database.DbState.

يمكن ضبط حالة قاعدة البيانات على إحدى القيم التالية:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. ابدأ معاملة

نفّذ Orm.Begin() لبدء معاملة على قاعدة البيانات. إذا لم تكن قاعدة البيانات في حالة داخلية State.Closed عند البدء فسيطرح استثناء InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. اكتب بعض البيانات إلى قاعدة البيانات

نفّذ Orm.Write() لكتابة بعض البيانات إلى قاعدة البيانات. إذا لم تكن قاعدة البيانات في حالة داخلية State.TransactionStarted عند البدء، أو كُتبت بيانات غير صالحة، فسيُطرح استثناء InvalidOperationException. وإذا فشلت الكتابة فيجب على Orm أن ينظّف قاعدة البيانات.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed

3. ثبّت البيانات المكتوبة سابقًا في قاعدة البيانات

نفّذ Orm.Commit() لتثبيت البيانات. إذا فشل التثبيت فنظّف قاعدة البيانات. وإذا لم تكن قاعدة البيانات في حالة داخلية State.DataWritten عند البدء فسيُطرح استثناء InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed

4. تأكّد من تنظيف قاعدة البيانات بشكل صحيح إذا اضطر نظام ORM إلى الإغلاق في منتصف معاملة

نفّذ الواجهة IDisposable على الصنف Orm. الاستدعاء مضمون النجاح.

var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
C# Exercism

مستعد لبدء الربط الكائني العلائقي؟

سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.