إذا كان صنفٌ ما يُنفّذ الواجهة 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.
يمكن ضبط حالة قاعدة البيانات على إحدى القيم التالية:
TransactionStartedDataWrittenInvalidClosedنفّذ Orm.Begin() لبدء معاملة على قاعدة البيانات. إذا لم تكن قاعدة البيانات في حالة داخلية State.Closed عند البدء فسيطرح استثناء InvalidOperationException.
var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted
نفّذ 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
نفّذ 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
نفّذ الواجهة 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
سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.