ट्रैक
/
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 को ट्रांज़ैक्शन के बीच में ही बंद करना पड़े, तो यह सुनिश्चित कीजिए कि डेटाबेस की सफाई ठीक से हो जाए।

Orm क्लास पर IDisposable इंटरफेस लागू कीजिए। इस कॉल के सफल होने की गारंटी है।

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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।