ট্র্যাক
/
C#
C#
/
অনুশীলনী
/
অবজেক্ট রিলেশনাল ম্যাপিং
অবজেক্ট রিলেশনাল ম্যাপিং

অবজেক্ট রিলেশনাল ম্যাপিং

লার্নিং অনুশীলনী

ভূমিকা

রিসোর্স ক্লিনআপ

কোনো ক্লাস যদি IDisposable ইন্টারফেস ইমপ্লিমেন্ট করে, তাহলে কোনো ইনস্ট্যান্স আর প্রয়োজন না থাকলেই তার Dispose() মেথড কল করতে হয়। সাধারণত এটি করা হয় কোনো catch বা finally ক্লজ থেকে, অথবা কোনো কলারের Dispose() রুটিন থেকে। Dispose() সুযোগ দেয় অপারেটিং সিস্টেমের অবজেক্টের মতো আনম্যানেজড রিসোর্সগুলো (যেগুলো .NET রানটাইম ম্যানেজ করে না) মুক্ত করার এবং ম্যানেজড রিসোর্সের অভ্যন্তরীণ অবস্থা রিসেট করার।

নির্দেশনা

আপনি একটি ডেটাবেজের উপরে একটি ORM (Object Relational Mapping) সিস্টেম তৈরি করছেন, যেটি অন্য একটি টিম সরবরাহ করেছে।

ডেটাবেজটি একবারে একটি মাত্র ট্রানজ্যাকশন সামলাতে পারে।

এই পর্যায়ে কোনো লগিং বা অন্য কোনো এরর হ্যান্ডলিং প্রয়োজন নেই।

মনে রাখবেন, ভেতরে ভেতরে ডেটাবেজটি কয়েকটি স্টেটের মধ্য দিয়ে যায়: 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।