Microsoft Technologies Fluent NHibernate এর সাথে Complex Mapping গাইড ও নোট

311

Fluent NHibernate হল NHibernate-এর জন্য একটি ফ্লুয়েন্ট API যা আপনাকে প্রোগ্রামেটিকভাবে মডেল ক্লাসগুলির জন্য ম্যাপিং কনফিগারেশন তৈরি করতে সহায়তা করে। এটি ডোমেইন মডেল এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে সহজ এবং পরিষ্কার পদ্ধতি প্রদান করে। Complex Mapping কৌশলগুলি তখন ব্যবহার করা হয় যখন আপনার মডেল ক্লাসগুলো মধ্যে একাধিক সম্পর্ক, বিভিন্ন ধরনের কলাম মAPPING, বা কমপ্লেক্স ডেটা স্ট্রাকচার থাকতে পারে।

এখানে, Fluent NHibernate এর মাধ্যমে Complex Mapping সম্পর্কে কিছু উদাহরণ দেখানো হয়েছে যা আপনাকে একটি Complex Model বা Complex Class মডেল তৈরি এবং ম্যাপ করার জন্য সাহায্য করবে।


1. One-to-One Relationship Mapping

ধরা যাক, আপনার একটি Person ক্লাস এবং একটি Passport ক্লাস রয়েছে, যেখানে Person ক্লাসে একটি Passport অবজেক্ট রয়েছে এবং এটি One-to-One সম্পর্ক। এখানে, একজন ব্যক্তি একটিমাত্র পাসপোর্ট ধারণ করতে পারে এবং পাসপোর্ট শুধুমাত্র এক ব্যক্তির জন্য নির্ধারিত।

1.1 Entity Classes:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Passport Passport { get; set; }
}

public class Passport
{
    public virtual int Id { get; set; }
    public virtual string PassportNumber { get; set; }
    public virtual Person Owner { get; set; }
}

1.2 Fluent Mapping for One-to-One Relationship:

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Table("Persons");
        Id(x => x.Id);
        Map(x => x.Name);
        HasOne(x => x.Passport)
            .Cascade.All() // If a Person is deleted, their Passport is also deleted
            .Constrained(); // Foreign key will be created on the Passport table
    }
}

public class PassportMap : ClassMap<Passport>
{
    public PassportMap()
    {
        Table("Passports");
        Id(x => x.Id);
        Map(x => x.PassportNumber);
        References(x => x.Owner)
            .Cascade.None(); // Passport does not delete the person
    }
}

এখানে, HasOne এবং References ব্যবহৃত হয়েছে One-to-One সম্পর্ক ম্যাপ করার জন্য।


2. One-to-Many Relationship Mapping

এটি একটি সাধারণ সম্পর্ক যেখানে একটি মডেল একাধিক সম্পর্কিত মডেল ধারণ করে। উদাহরণস্বরূপ, Order ক্লাস এবং OrderItem ক্লাস রয়েছে, যেখানে এক একটি অর্ডারের একাধিক আইটেম থাকতে পারে।

2.1 Entity Classes:

public class Order
{
    public virtual int Id { get; set; }
    public virtual string OrderNumber { get; set; }
    public virtual IList<OrderItem> Items { get; set; } = new List<OrderItem>();
}

public class OrderItem
{
    public virtual int Id { get; set; }
    public virtual string ItemName { get; set; }
    public virtual int Quantity { get; set; }
    public virtual Order Order { get; set; }
}

2.2 Fluent Mapping for One-to-Many Relationship:

public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Table("Orders");
        Id(x => x.Id);
        Map(x => x.OrderNumber);
        HasMany(x => x.Items)
            .Cascade.All()
            .Inverse();  // Inverse indicates the relationship is managed by OrderItem
    }
}

public class OrderItemMap : ClassMap<OrderItem>
{
    public OrderItemMap()
    {
        Table("OrderItems");
        Id(x => x.Id);
        Map(x => x.ItemName);
        Map(x => x.Quantity);
        References(x => x.Order)
            .Column("OrderId"); // Foreign key column in OrderItems table
    }
}

এখানে HasMany এবং References ব্যবহৃত হয়েছে। HasMany নির্দেশ করে যে একটি Order একাধিক OrderItem ধারণ করবে এবং Inverse ব্যবহার করা হয়েছে, যাতে OrderItem এর পক্ষ থেকে সম্পর্কের নিয়ন্ত্রণ করা যায়।


3. Many-to-Many Relationship Mapping

একটি Many-to-Many সম্পর্ক তখন ব্যবহৃত হয় যখন দুটি মডেল একে অপরের সাথে একাধিক সম্পর্ক থাকতে পারে। উদাহরণস্বরূপ, Student এবং Course ক্লাসে, যেখানে একজন ছাত্র একাধিক কোর্স নিতে পারে এবং একটি কোর্সে একাধিক ছাত্র থাকতে পারে।

3.1 Entity Classes:

public class Student
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Course> Courses { get; set; } = new List<Course>();
}

public class Course
{
    public virtual int Id { get; set; }
    public virtual string CourseName { get; set; }
    public virtual IList<Student> Students { get; set; } = new List<Student>();
}

3.2 Fluent Mapping for Many-to-Many Relationship:

public class StudentMap : ClassMap<Student>
{
    public StudentMap()
    {
        Table("Students");
        Id(x => x.Id);
        Map(x => x.Name);
        HasManyToMany(x => x.Courses)
            .Cascade.All()  // Both students and courses will be updated/deleted in sync
            .Table("StudentCourses"); // Join table name
    }
}

public class CourseMap : ClassMap<Course>
{
    public CourseMap()
    {
        Table("Courses");
        Id(x => x.Id);
        Map(x => x.CourseName);
        HasManyToMany(x => x.Students)
            .Cascade.All()
            .Table("StudentCourses");
    }
}

এখানে, HasManyToMany পদ্ধতি ব্যবহার করা হয়েছে, যা Many-to-Many সম্পর্কের জন্য উপযুক্ত। এছাড়া, Join Table StudentCourses তৈরি করা হয়েছে যা এই সম্পর্কের জন্য মধ্যস্থ ভূমিকা পালন করবে।


4. Complex Type Mapping (Embedded Value Types)

কখনো কখনো আমাদের মডেল ক্লাসে একটি Complex Type থাকতে পারে, যেখানে একাধিক প্রপার্টি একটি একক কনসেপ্ট বা সত্তা হিসাবে ধারণ করা হয়। উদাহরণস্বরূপ, একটি Address ক্লাস হতে পারে যা একটি Person ক্লাসে এম্বেড করা।

4.1 Entity Classes:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Address Address { get; set; }
}

public class Address
{
    public virtual string Street { get; set; }
    public virtual string City { get; set; }
    public virtual string PostalCode { get; set; }
}

4.2 Fluent Mapping for Complex Type (Embedded Value Type):

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Table("Persons");
        Id(x => x.Id);
        Map(x => x.Name);
        Component(x => x.Address, m =>
        {
            m.Map(x => x.Street);
            m.Map(x => x.City);
            m.Map(x => x.PostalCode);
        });
    }
}

public class AddressMap : ClassMap<Address>
{
    public AddressMap()
    {
        Table("Addresses"); // This may not be required if Address is just an embedded value
        Map(x => x.Street);
        Map(x => x.City);
        Map(x => x.PostalCode);
    }
}

এখানে, Component ব্যবহার করা হয়েছে যা Complex Types এর জন্য ব্যবহৃত হয়। এতে, Address ক্লাসের ফিল্ডগুলো একটি একক সত্তার মতো মডেল করা হয়, কিন্তু বাস্তবে Person টেবিলেই ধারণ করা হয়।


সারাংশ

Fluent NHibernate এর মাধ্যমে Complex Mapping অত্যন্ত শক্তিশালী এবং নমনীয় পদ্ধতি। এটি আপনাকে সম্পর্কিত ডোমেন মডেলগুলির মধ্যে সম্পর্ক নির্ধারণ করতে এবং সঠিকভাবে ডেটাবেস টেবিলগুলিতে ম্যাপিং করতে সাহায্য করে। One-to-One, One-to-Many, Many-to-Many এবং Complex Type Mapping এর মাধ্যমে আপনি সহজেই শক্তিশালী এবং স্কেলেবল ডেটাবেস অ্যাপ্লিকেশন তৈরি করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...