NHibernate ব্যবহার করতে হলে আপনাকে Entity Class এবং Mapping Files তৈরি করতে হবে। Entity Class হল সেই ক্লাস যা আপনার ডেটাবেসের টেবিলের প্রতিনিধিত্ব করে, এবং Mapping File বা Fluent Mapping হল সেই উপায় যার মাধ্যমে NHibernate জানবে কিভাবে ক্লাসের প্রোপার্টি গুলোকে টেবিলের কলামে ম্যাপ করতে হবে।
এখানে Entity Class এবং Mapping File তৈরি করার প্রক্রিয়া আলোচনা করা হবে।
1. Entity Class তৈরি করা
একটি Entity Class হল একটি সাধারণ C# ক্লাস যা ডেটাবেসের টেবিলের সঙ্গে সম্পর্কিত। প্রতিটি ক্লাসের একটি প্রপার্টি ডেটাবেস টেবিলের একটি কলামের প্রতিনিধিত্ব করবে।
উদাহরণস্বরূপ, একটি Employee নামক Entity Class তৈরি করা যাক, যা Employee টেবিলের জন্য প্রতিনিধিত্ব করবে।
public class Employee
{
public virtual int Id { get; set; } // Primary Key (ID)
public virtual string Name { get; set; } // Employee's Name
public virtual int Age { get; set; } // Employee's Age
public virtual string Position { get; set; } // Employee's Position
}
এখানে:
Id,Name,Age, এবংPositionপ্রপার্টিগুলিEmployeeটেবিলের কলামগুলির প্রতিনিধিত্ব করছে।- virtual কীওয়ার্ডটি NHibernate এর জন্য অত্যাবশ্যক, কারণ NHibernate এই প্রোপার্টি গুলিকে প্রক্সি হিসাবে ট্র্যাক করে।
2. Mapping File তৈরি করা (XML Mapping)
NHibernate তে XML Mapping একটি কনফিগারেশন ফাইল যা Entity Class এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে। এই ফাইলটি .hbm.xml এক্সটেনশনে সংরক্ষিত হয়।
Employee Entity Class এর জন্য একটি Mapping File উদাহরণ নিচে দেওয়া হলো:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!-- Mapping the Employee entity class to the employee table -->
<class name="Employee" table="Employee">
<!-- Mapping Id field to the primary key column -->
<id name="Id" column="EmployeeID">
<generator class="identity"/>
</id>
<!-- Mapping Name, Age, and Position fields to respective columns -->
<property name="Name" column="Name" />
<property name="Age" column="Age" />
<property name="Position" column="Position" />
</class>
</hibernate-mapping>
এখানে:
- class name="Employee":
Employeeক্লাসটি Employee টেবিলের সঙ্গে ম্যাপ করা হয়েছে। - id:
Idপ্রোপার্টিEmployeeIDকলামের সঙ্গে ম্যাপ করা হয়েছে, এবংgenerator class="identity"সেটিং এর মাধ্যমে এটি অটোমেটিক ইনক্রিমেন্ট হবে। - property: অন্যান্য প্রোপার্টি গুলি যথাক্রমে
Name,Age, এবংPositionকলামের সঙ্গে ম্যাপ করা হয়েছে।
এই Mapping File টি NHibernate কে বলে যে Employee ক্লাসের Id প্রোপার্টিটি EmployeeID কলামের সঙ্গে সম্পর্কিত এবং অন্যান্য প্রোপার্টি গুলি নিজেদের কলামের সঙ্গে সম্পর্কিত।
3. Fluent Mapping ব্যবহার করে Entity Mapping
NHibernate তে Fluent Mapping একটি আধুনিক এবং অনেক জনপ্রিয় উপায়, যেখানে C# কোডের মাধ্যমে Entity এবং টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়। এই পদ্ধতিতে XML Mapping ফাইল ব্যবহার না করে শুধুমাত্র কোডের মাধ্যমে Mapping করা হয়।
এখানে Employee Entity Class এর জন্য Fluent Mapping উদাহরণ দেওয়া হলো:
using FluentNHibernate.Mapping;
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
// Mapping Employee class to the Employee table
Table("Employee");
// Mapping the Id property to EmployeeID column
Id(x => x.Id).Column("EmployeeID").GeneratedBy.Identity();
// Mapping other properties
Map(x => x.Name).Column("Name");
Map(x => x.Age).Column("Age");
Map(x => x.Position).Column("Position");
}
}
এখানে:
- Table("Employee"):
Employeeক্লাসটিEmployeeটেবিলের সঙ্গে সম্পর্কিত। - Id(x => x.Id):
Idপ্রোপার্টিEmployeeIDকলামের সঙ্গে সম্পর্কিত, এবংGeneratedBy.Identity()ব্যবহার করে অটোমেটিক ইনক্রিমেন্ট ফিচার চালু করা হয়েছে। - Map(): অন্যান্য প্রোপার্টি গুলির জন্য টেবিলের কলাম নির্দেশ করা হয়েছে।
Fluent Mapping এ কোড দিয়ে Entity Class এবং টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়, যা XML Mapping এর তুলনায় অনেক বেশি সুবিধাজনক এবং পড়তে সহজ।
4. Session এ Entity ব্যবহার করা
এখন যেহেতু আমাদের Entity Class এবং Mapping File তৈরি হয়ে গেছে, চলুন দেখি কিভাবে সেশন তৈরি করে ডেটাবেসের সঙ্গে যোগাযোগ করা যায় এবং Entity থেকে ডেটা সংগ্রহ করা যায়।
using NHibernate;
public class EmployeeRepository
{
public Employee GetEmployee(int id)
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
var employee = session.Get<Employee>(id);
return employee;
}
}
}
এখানে:
- session.Get(id):
Employeeটেবিল থেকে নির্দিষ্টidএর সাথে মিল পাওয়াEmployeeঅবজেক্টটি লোড করা হচ্ছে।
উপসংহার
- Entity Class তৈরি করার মাধ্যমে আমরা ডেটাবেস টেবিলের জন্য একটি C# ক্লাস তৈরি করি।
- Mapping File (XML বা Fluent) ব্যবহার করে আমরা Entity Class এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করি।
- XML Mapping এবং Fluent Mapping দুই ধরনের ম্যাপিং পদ্ধতি রয়েছে, যেখানে Fluent Mapping আধুনিক এবং প্রোগ্রামিং কোডে ভালো ইন্টিগ্রেশন প্রদান করে।
এভাবে Entity এবং Mapping ফাইল তৈরি করে আপনি NHibernate এর মাধ্যমে ORM কার্যক্রম পরিচালনা করতে পারবেন।
NHibernate ব্যবহার করার জন্য প্রথমে আপনাকে আপনার ডেটাবেস টেবিলগুলির জন্য Entity Class তৈরি করতে হবে। এই ক্লাসগুলি ORM মডেল হিসেবে কাজ করে, এবং তাদের মাধ্যমে আপনি ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন করতে পারবেন। Entity Class গুলোকে সঠিকভাবে ম্যাপিং করতে Data Annotations ব্যবহার করা হয়, যা NHibernate এর সাথে ক্লাসগুলোকে সম্পর্কিত করে।
1. Entity Class তৈরি করা
Entity Class হল সেই C# ক্লাস যা ডেটাবেস টেবিলের সারি (row) এর সাথে মেলানো হয়। প্রতিটি Entity Class এর ফিল্ড/প্রপার্টি একটি টেবিলের কলাম (column) এর সাথে ম্যাপ হয়।
ধরা যাক, আমরা একটি Employee টেবিলের Entity Class তৈরি করতে যাচ্ছি। এর জন্য নিম্নলিখিত স্টেপ অনুসরণ করা যেতে পারে:
using System;
public class Employee
{
public virtual int Id { get; set; } // Primary Key
public virtual string Name { get; set; } // Employee Name
public virtual int Age { get; set; } // Employee Age
public virtual string Department { get; set; } // Department Name
}
এখানে:
Idপ্রপার্টি হলো Primary Key যা টেবিলের ইউনিক আইডেন্টিফায়ার।Name,Age, এবংDepartmentপ্রপার্টি গুলো Employee টেবিলের কলামগুলোর প্রতিনিধিত্ব করে।
2. Entity Class এ Data Annotations ব্যবহার করা
Data Annotations হল একটি C# বৈশিষ্ট্য (attribute), যা Entity ক্লাসের প্রপার্টি এবং ফিল্ডগুলোর সাথে ডেটাবেসের কলামগুলির সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। NHibernate এ Entity ক্লাসের প্রপার্টিগুলোকে ম্যাপিং করার জন্য Data Annotations ব্যবহার করা হয়।
সাধারণ Data Annotations:
- [Key]: এটি একটি প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করে।
- [Table]: এটি Entity Class কে নির্দিষ্ট একটি ডেটাবেস টেবিলের সাথে সংযুক্ত করে।
- [Column]: এটি Entity এর প্রপার্টি কে টেবিলের নির্দিষ্ট কলামের সাথে ম্যাপ করে।
- [Required]: এটি একটি প্রপার্টিকে আবশ্যক হিসেবে চিহ্নিত করে, অর্থাৎ ফিল্ডটি নাল (null) হতে পারে না।
- [StringLength]: এটি স্ট্রিং প্রপার্টির সর্বোচ্চ দৈর্ঘ্য নির্ধারণ করে।
ধরা যাক, আমরা পূর্বের Employee ক্লাসে Data Annotations প্রয়োগ করতে চাই।
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[Table("Employee")] // টেবিলের নাম উল্লেখ করা হয়েছে
public class Employee
{
[Key] // Primary Key
public virtual int Id { get; set; }
[Required] // এই প্রপার্টি নাল (null) হতে পারবে না
[StringLength(100)] // সর্বোচ্চ দৈর্ঘ্য 100 ক্যারেকটার
public virtual string Name { get; set; }
[Range(18, 65)] // বয়স ১৮ থেকে ৬৫ এর মধ্যে থাকতে হবে
public virtual int Age { get; set; }
[StringLength(50)] // বিভাগের নামের সর্বোচ্চ দৈর্ঘ্য ৫০ ক্যারেকটার
public virtual string Department { get; set; }
}
এখানে:
- [Table("Employee")] এটিকে Employee নামে একটি টেবিলের সাথে ম্যাপ করে।
- [Key] এটিকে Primary Key হিসেবে চিহ্নিত করেছে।
- [Required] এবং [StringLength] এটিকে বাধ্যতামূলক এবং দৈর্ঘ্য নির্ধারণ করেছে।
- [Range] বয়সের জন্য একটি সীমা নির্ধারণ করেছে (১৮ থেকে ৬৫ বছর)।
3. Entity Class এবং Data Annotations এর সাহায্যে NHibernate ম্যাপিং
NHibernate এর জন্য Entity ক্লাসের সঙ্গে Data Annotations ব্যবহার করা হলে, সাধারণত ম্যাপিং ফাইলের প্রয়োজন হয় না, কারণ NHibernate এই অ্যানোটেশনগুলিকে স্বয়ংক্রিয়ভাবে বুঝে ম্যাপিং করবে। তবে, কিছু পরিস্থিতিতে Fluent NHibernate বা XML Mapping এর মাধ্যমে আরো কাস্টমাইজড ম্যাপিং করতে হতে পারে।
4. NHibernate এ Entity Class ব্যবহারের উদাহরণ
একটি সাধারন Session ওপেন করার পর, Entity Class এর ডেটা সেভ, আপডেট, বা রিড করার জন্য নিচের কোডটি ব্যবহার করা যেতে পারে:
using NHibernate;
using NHibernate.Cfg;
using System;
public class NHibernateHelper
{
private static ISessionFactory sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure(); // hibernate.cfg.xml ফাইল লোড হবে
sessionFactory = configuration.BuildSessionFactory(); // সেশন ফ্যাক্টরি তৈরি
}
return sessionFactory;
}
}
}
public class SessionExample
{
public void SaveEmployee()
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
// নতুন Employee অবজেক্ট তৈরি
var employee = new Employee { Name = "John Doe", Age = 30, Department = "HR" };
// ডেটাবেসে সেভ করা
session.Save(employee);
// ট্রানজেকশন কমিট করা
transaction.Commit();
}
catch (Exception)
{
// কোনো সমস্যা হলে ট্রানজেকশন রোলব্যাক করা
transaction.Rollback();
throw;
}
}
}
}
}
এখানে:
- SaveEmployee মেথডে নতুন Employee অবজেক্ট তৈরি করে সেশন মাধ্যমে এটি ডেটাবেসে সেভ করা হচ্ছে।
- transaction.Commit() ব্যবহার করে ট্রানজেকশন সফলভাবে সম্পন্ন হচ্ছে।
5. Entity Class এর সাথে Data Annotations ব্যবহার করার সুবিধা
- কমপ্যাক্ট এবং সহজ: Data Annotations সরাসরি Entity Class এ রাখা হয়, যা কোডকে কমপ্যাক্ট এবং পরিষ্কার রাখে।
- ডেভেলপমেন্টের সময় দ্রুত যাচাই: প্রপার্টি গুলোর উপর অ্যানোটেশন ব্যবহার করলে ডেভেলপাররা সহজেই বুঝতে পারেন কোন প্রপার্টি কী ধরনের রুল অনুসরণ করছে (যেমন নাল হতে পারবে না, সর্বোচ্চ দৈর্ঘ্য কত, ইত্যাদি)।
- এডিটেবল এবং রিয়ুজেবল: Entity Class গুলো বারবার ব্যবহৃত হতে পারে এবং Data Annotations এর মাধ্যমে সেগুলির সাথে সংযুক্ত ডেটাবেস রুলগুলো সহজেই প্রয়োগ করা যায়।
এইভাবে, Entity Class তৈরি এবং Data Annotations ব্যবহার করে NHibernate এ আপনার ORM মডেল তৈরি করতে পারেন এবং ডেটাবেসের সাথে যোগাযোগের জন্য প্রপার কনফিগারেশন করতে পারেন।
NHibernate এ Entity Class এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করার জন্য Mapping ফাইল ব্যবহার করা হয়। এই ফাইলটি XML ফর্ম্যাটে থাকে এবং এটি Entity Class এর প্রপার্টি গুলোকে ডেটাবেস টেবিলের কলামগুলোর সাথে ম্যাপ করে।
Mapping ফাইল (.hbm.xml) তৈরি করা
প্রথমে, আপনাকে একটি XML ফাইল তৈরি করতে হবে, যেটি Entity Class এর জন্য Mapping ফাইল হবে। সাধারণত, Mapping ফাইলের নাম Entity Class এর নামের সাথে মিল রাখলে ভালো হয়। যেমন, যদি Entity Class এর নাম Employee হয়, তাহলে Mapping ফাইলের নাম হতে পারে Employee.hbm.xml।
এখানে একটি উদাহরণ দেয়া হলো:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Employee" table="Employee">
<id name="Id" column="Id">
<generator class="identity"/>
</id>
<property name="Name" column="Name" />
<property name="Age" column="Age" />
<property name="Department" column="Department" />
</class>
</hibernate-mapping>
এখানে:
<class>ট্যাগটি Entity Class (এখানেEmployee) এবং ডেটাবেস টেবিলের (এখানেEmployee) মধ্যে সম্পর্ক তৈরি করে।<id>ট্যাগটি Primary Key এর জন্য, যেখানেIdপ্রপার্টি এবংIdকলাম ম্যাপ করা হচ্ছে।<property>ট্যাগগুলো Entity Class এর প্রপার্টি এবং ডেটাবেস টেবিলের কলামগুলোর মধ্যে সম্পর্ক স্থাপন করে।
Mapping ফাইল কনফিগার করা
NHibernate কে Mapping ফাইল ব্যবহার করতে বলার জন্য hibernate.cfg.xml কনফিগারেশন ফাইলে এই ফাইলের রেফারেন্স দিতে হয়। এর জন্য, আপনি mapping ট্যাগ ব্যবহার করতে পারেন।
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<!-- ডেটাবেস কানেকশন এবং অন্যান্য কনফিগারেশন -->
<!-- Mapping ফাইল যোগ করা -->
<mapping resource="Employee.hbm.xml" />
</session-factory>
</hibernate-configuration>
এখানে mapping ট্যাগের resource অ্যাট্রিবিউটে Mapping ফাইলের পথ উল্লেখ করা হয়েছে, যাতে NHibernate সেই ফাইলটি লোড করে।
Mapping ফাইল এবং Entity Class এর মধ্যে সম্পর্ক
Mapping ফাইল ব্যবহার করার সময়, Entity Class এবং Mapping ফাইলের মধ্যে সঠিক সম্পর্ক বজায় রাখতে হবে। Name এবং Column অ্যাট্রিবিউটগুলোর মাধ্যমে Entity Class এর প্রপার্টি এবং ডেটাবেসের কলামকে সঠিকভাবে ম্যাপ করা হয়।
এছাড়াও, আপনি OneToMany, ManyToOne, ManyToMany ইত্যাদি রিলেশনশিপও Mapping ফাইলের মাধ্যমে কনফিগার করতে পারেন।
Mapping ফাইল ব্যবহার করে NHibernate Session এর সাথে কাজ করা
একবার Mapping ফাইল কনফিগার হয়ে গেলে, আপনি NHibernate এর Session ব্যবহার করে CRUD অপারেশন করতে পারবেন। নিচের উদাহরণটি দেখুন:
using NHibernate;
using NHibernate.Cfg;
public class EmployeeService
{
public void AddEmployee(Employee employee)
{
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(employee);
transaction.Commit();
}
}
}
}
এখানে:
- Session ব্যবহার করা হচ্ছে Entity Class
Employeeএর ইনস্ট্যান্স সেভ করার জন্য। transaction.Commit()কলের মাধ্যমে সেশনটি কমিট করা হচ্ছে।
Mapping ফাইল এবং Data Annotations ব্যবহার করে NHibernate এর Entity Class গুলোকে ডেটাবেসের টেবিলের সাথে ম্যাপিং করা যায়, যা আপনাকে CRUD অপারেশন সহজে পরিচালনা করতে সহায়তা করে।
- Fluent NHibernate হল NHibernate এর একটি উন্নত এবং প্রোগ্রামেটিক API, যা ORM মডেল (Entity Classes) এবং ডেটাবেস টেবিলের মধ্যে ম্যাপিং সম্পাদন করতে সহজ এবং কার্যকরী পদ্ধতি প্রদান করে। Fluent NHibernate কনফিগারেশন এবং ম্যাপিং এর জন্য XML ফাইলের পরিবর্তে কোড-বেসড পদ্ধতি ব্যবহার করা হয়, যা অনেক বেশি প্রাপ্তিযোগ্য এবং কোডের মাধ্যমে সহজে কনফিগার করা যায়।
Fluent NHibernate ব্যবহার করে Entity ক্লাস এবং ডেটাবেস টেবিলের মধ্যে ম্যাপিং করা হয়, এবং এই ম্যাপিংে আপনি শ্রেণীর প্রপার্টি এবং টেবিল কলামের মধ্যে সম্পর্ক নির্ধারণ করেন।
1. Fluent NHibernate ইন্সটল করা
প্রথমে, Fluent NHibernate ব্যবহার করতে হবে, সেজন্য NuGet প্যাকেজ ম্যানেজার ব্যবহার করে নিম্নলিখিত প্যাকেজ ইনস্টল করুন:
Install-Package FluentNHibernate
2. Entity ক্লাস তৈরি করা
এখানে একটি উদাহরণ Entity ক্লাস হিসেবে একটি Employee ক্লাস তৈরি করা হয়েছে, যা একটি ডেটাবেস টেবিলের সাথে ম্যাপ হবে।
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Age { get; set; }
}
এটি একটি সাধারণ C# ক্লাস যা তিনটি প্রপার্টি ধারণ করে: Id, Name, এবং Age।
3. Fluent NHibernate Mapping তৈরি করা
Fluent NHibernate এর মাধ্যমে Entity ক্লাসের জন্য ম্যাপিং তৈরি করা হয়। এই ম্যাপিং ক্লাসে আমরা ক্লাসের প্রপার্টি এবং ডেটাবেস টেবিলের কলামগুলির মধ্যে সম্পর্ক তৈরি করি।
using FluentNHibernate.Mapping;
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
// টেবিলের নাম সেট করা
Table("Employees");
// প্রপার্টি এবং টেবিল কলামের মধ্যে সম্পর্ক স্থাপন
Id(x => x.Id).GeneratedBy.Identity(); // Identity প্রপার্টি, প্রাথমিক কী
Map(x => x.Name).Length(100).Not.Nullable(); // Name কলাম, Length এবং Nullable কনফিগারেশন
Map(x => x.Age).Not.Nullable(); // Age কলাম
}
}
এখানে:
- Table("Employees"): ডেটাবেস টেবিলের নাম
Employeesনির্ধারণ করে। - Id(x => x.Id).GeneratedBy.Identity():
Idপ্রপার্টি প্রাথমিক কী হিসেবে ব্যবহৃত হবে এবং এটি Identity প্রপার্টি, অর্থাৎ, এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে। - Map(x => x.Name).Length(100).Not.Nullable():
Nameপ্রপার্টি টেবিলের কলামের সাথে ম্যাপ হবে, যেখানে কলামের দৈর্ঘ্য 100 এবং এটিNullableহবে না। - Map(x => x.Age).Not.Nullable():
Ageপ্রপার্টি টেবিলের কলামের সাথে ম্যাপ হবে এবং এটিNullableহবে না।
4. Fluent NHibernate কনফিগারেশন এবং SessionFactory তৈরি করা
Fluent NHibernate ব্যবহার করে কনফিগারেশন সেটআপ করা হয় এবং তারপর সেশন ফ্যাক্টরি তৈরি করা হয়। নিচে একটি উদাহরণ দেয়া হলো যেখানে Fluent NHibernate এর কনফিগারেশন এবং SessionFactory তৈরি করা হয়েছে:
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using System;
public class NHibernateHelper
{
private static ISessionFactory sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.Is("Server=yourserver;Database=yourdb;Integrated Security=True;")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<EmployeeMap>()) // EmployeeMap ক্লাসটি ম্যাপিংয়ের জন্য ব্যবহার হবে
.BuildSessionFactory();
}
return sessionFactory;
}
}
}
এখানে:
- Fluently.Configure(): Fluent NHibernate কনফিগারেশন শুরু করে।
- Database(MsSqlConfiguration.MsSql2008.ConnectionString(...)): SQL Server 2008 এর জন্য কানেকশন স্ট্রিং কনফিগার করা হয়েছে।
- Mappings(m => m.FluentMappings.AddFromAssemblyOf()):
EmployeeMapক্লাসটি ম্যাপিং কনফিগারেশনের জন্য যোগ করা হয়েছে। এখানেAddFromAssemblyOf<EmployeeMap>()ব্যবহার করা হয়েছে যাতে সমস্ত Fluent Mapping কনফিগারেশন এই অ্যাসেম্বলি থেকে স্বয়ংক্রিয়ভাবে অ্যাড হয়।
5. Session ব্যবহার করে ডেটাবেস অপারেশন
Fluent NHibernate কনফিগারেশন এবং Mapping প্রস্তুত হওয়ার পর, এখন আমরা সেশন তৈরি করে ডেটাবেসে অপারেশন সম্পাদন করতে পারি। নিচে একটি উদাহরণ দেওয়া হলো যেখানে Employee অবজেক্ট সেভ করা হচ্ছে:
using NHibernate;
using System;
public class SessionExample
{
public void SaveEmployee()
{
// সেশন তৈরি করা
using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
var employee = new Employee { Name = "John Doe", Age = 30 };
session.Save(employee); // Employee অবজেক্ট সেভ করা
transaction.Commit(); // ট্রানজেকশন কমিট করা
}
catch (Exception)
{
transaction.Rollback(); // কোনো সমস্যা হলে ট্রানজেকশন রোলব্যাক করা
throw;
}
}
}
}
}
এখানে:
- session.Save(employee):
Employeeঅবজেক্ট ডেটাবেসে সেভ করা হচ্ছে। - transaction.Commit(): ট্রানজেকশন সফল হলে, সমস্ত পরিবর্তন ডেটাবেসে সেভ হবে।
6. Fluent NHibernate এর সুবিধা
- কমপ্লেক্স ম্যাপিং সহজ করা: Fluent NHibernate ডাইনামিক ম্যাপিং কনফিগারেশন প্রদান করে, যা XML কনফিগারেশন ফাইলের তুলনায় অনেক বেশি সহজ এবং পাঠযোগ্য।
- টেকনিক্যাল ডিপেনডেন্সি কমানো: XML ফাইলের পরিবর্তে কোড-ভিত্তিক কনফিগারেশন ব্যবহারের মাধ্যমে ডিপেনডেন্সি ম্যানেজমেন্ট সহজ হয়।
- গঠনমূলক এবং স্বচ্ছ কনফিগারেশন: Fluent NHibernate কোডের মাধ্যমে স্বচ্ছ এবং গঠনমূলক কনফিগারেশন প্রদান করে, যা স্কেলেবিলিটি ও রক্ষণাবেক্ষণ সহজ করে।
Fluent NHibernate এর মাধ্যমে কনফিগারেশন এবং ম্যাপিং অত্যন্ত সহজ এবং প্রোগ্রামেটিক পদ্ধতিতে সম্পাদন করা যায়। এর ফলে ডেটাবেস এবং মডেল ক্লাসের মধ্যে সম্পর্ক খুবই স্পষ্ট ও কার্যকরীভাবে তৈরি হয়।
NHibernate এর Attribute-based mapping টেকনিক ব্যবহার করে আপনি ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে পারেন, যেখানে XML ফাইলের পরিবর্তে C# অ্যাট্রিবিউট ব্যবহার করা হয়। এটি কোড-বেসড কনফিগারেশনের জন্য আরও সুবিধাজনক এবং সহজ হতে পারে, বিশেষ করে ছোট বা মাঝারি আকারের অ্যাপ্লিকেশনের জন্য।
1. Attribute-based Mapping Overview
Attribute-based mapping হল একটি পদ্ধতি যা আপনার C# ক্লাসের উপর সরাসরি বিভিন্ন NHibernate অ্যাট্রিবিউট প্রয়োগ করে ডেটাবেসের টেবিল এবং কলামের সাথে সম্পর্ক স্থাপন করে। এতে ক্লাসের প্রপার্টি বা ফিল্ডগুলোর উপর বিভিন্ন মেটাডেটা অ্যাট্রিবিউট হিসেবে অ্যাপ্লাই করা হয়, যা NHibernate কে ডেটাবেসে মডেলটি কিভাবে ম্যাপ করতে হবে তা বলে।
এই পদ্ধতিতে Fluent NHibernate অথবা NHibernate's built-in attributes ব্যবহার করা হয়।
2. প্রধান অ্যাট্রিবিউটসমূহ
[Class]: ক্লাসের উপর অ্যাট্রিবিউট
এটি ক্লাসের মডেল টেবিলের সাথে সম্পর্ক স্থাপন করে। Table অ্যাট্রিবিউট দিয়ে টেবিলের নাম নির্ধারণ করা হয়।
[Class(Table = "Employee")]
public class Employee
{
// প্রপার্টি বা ফিল্ডস
}
[Id]: প্রাইমারি কীগুলির জন্য
এটি ক্লাসের প্রাইমারি কীগুলোর জন্য ব্যবহৃত হয়। Column অ্যাট্রিবিউট দিয়ে কলামের নাম দেওয়া হয়।
[Id(Name = "EmployeeId", Column = "employee_id")]
public int EmployeeId { get; set; }
[Property]: সাধারণ প্রপার্টির জন্য
কোনো সাধারণ প্রপার্টি যা ডেটাবেসের কলামের সাথে ম্যাপ হতে চায়, তাকে Property অ্যাট্রিবিউট ব্যবহার করে ঘোষণা করা হয়।
[Property(Column = "EmployeeName")]
public string Name { get; set; }
[ManyToOne]: অন্য ক্লাসের সাথে সম্পর্ক
যদি একাধিক অ্যাট্রিবিউট একে অপরের সাথে সম্পর্কিত হয়, তবে ManyToOne ব্যবহার করা হয়। এটি একটি সম্পর্ক (এফকে) স্থাপন করে।
[ManyToOne(Name = "Department", Column = "department_id")]
public Department Department { get; set; }
[OneToMany]: একাধিক সম্পর্কের জন্য
এটি ক্লাসের মধ্যে একাধিক সম্পর্ক স্থাপন করে, যেমন এক-থেকে-বহু (One-to-Many) সম্পর্ক।
[OneToMany(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
[Bag]: নন-অর্ডারড কালেকশন
Bag ব্যবহার করা হয় যখন সম্পর্কিত প্রপার্টি বা ফিল্ডগুলির কোনো নির্দিষ্ট অর্ডার নেই।
[Bag(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
[ManyToMany]: বহু-থেকে-বহু সম্পর্ক
এটি ব্যবহার করা হয় বহু-থেকে-বহু সম্পর্ক স্থাপনের জন্য, যেমন, একাধিক কর্মচারী একাধিক প্রকল্পে কাজ করতে পারে।
[ManyToMany(Name = "Projects", Table = "EmployeeProjects", Column = "project_id")]
public IList<Project> Projects { get; set; }
3. Mapping Example
এখন আসুন, একটি উদাহরণ দেখি যেখানে দুটি ক্লাস—Employee এবং Department এর মধ্যে সম্পর্ক তৈরি করা হয়েছে:
[Class(Table = "Employees")]
public class Employee
{
[Id(Name = "EmployeeId", Column = "employee_id")]
public int EmployeeId { get; set; }
[Property(Column = "EmployeeName")]
public string Name { get; set; }
[ManyToOne(Name = "Department", Column = "department_id")]
public Department Department { get; set; }
}
[Class(Table = "Departments")]
public class Department
{
[Id(Name = "DepartmentId", Column = "department_id")]
public int DepartmentId { get; set; }
[Property(Column = "DepartmentName")]
public string Name { get; set; }
[OneToMany(Name = "Employees", Key = "department_id")]
public IList<Employee> Employees { get; set; }
}
4. Configuration এবং SessionFactory Setup
এবার, SessionFactory এবং Session সেটআপ করা প্রয়োজন। এখানে Configuration এবং SessionFactory তৈরির প্রক্রিয়া দেওয়া হলো:
var configuration = new Configuration();
configuration.Configure(); // hibernate.cfg.xml ফাইল লোড করবে
configuration.AddAssembly(typeof(Employee).Assembly); // ক্লাসগুলি অ্যাসেম্বলিতে যোগ করা
var sessionFactory = configuration.BuildSessionFactory();
এটি Employee এবং Department ক্লাসগুলোকে সহকারে সেশন ফ্যাক্টরি তৈরি করবে, যেখানে Mapping এবং DB টেবিলের সাথে সম্পর্ক ইতিমধ্যে অ্যাট্রিবিউট দ্বারা প্রতিষ্ঠিত।
5. Advantages of Attribute-based Mapping
- Code-centric Approach: XML কনফিগারেশন ফাইলের পরিবর্তে কোডের মধ্যে Mapping পরিচালনা করা যায়, যা ডেভেলপারদের জন্য আরও সহজ এবং স্বচ্ছ।
- Reduced XML Overhead: অ্যাট্রিবিউট ব্যবহারের মাধ্যমে XML কনফিগারেশন ফাইলের প্রয়োজন কমে যায়।
- IntelliSense Support: কোড লেখার সময় IDE তে IntelliSense সুবিধা পাওয়া যায়, যা ডেভেলপারদের দ্রুত কাজ করতে সহায়তা করে।
6. Limitations
- Less Flexibility: কিছু পরিস্থিতিতে XML কনফিগারেশন আরও নমনীয় হতে পারে, কারণ সেখানে আরও বিস্তারিত কনফিগারেশন করা যায়।
- Cluttered Code: অ্যাট্রিবিউট-based mapping ব্যবহারে ক্লাসের কোডে অনেক অ্যাট্রিবিউট থাকতে পারে, যা কোডটিকে ক্লাটারড (গাদা) করে তুলতে পারে।
Attribute-based mapping NHibernate এর মধ্যে কোড-বেসড কনফিগারেশনের জন্য একটি শক্তিশালী পদ্ধতি, যা সহজ এবং দ্রুত অ্যাপ্লিকেশন ডেভেলপমেন্টে সহায়ক।
Read more