Database Context এবং DbContext Class

Microsoft Technologies - এন্টিটি ফ্রেমওয়র্ক (Entity Framework)
223
223

Entity Framework (EF) এর একটি গুরুত্বপূর্ণ অংশ হলো DbContext। এটি ডেটাবেসের সাথে সংযুক্ত এবং ডেটাবেসে থাকা টেবিলের সাথে যোগাযোগ করার জন্য ব্যবহৃত হয়। DbContext ক্লাসটি আপনার ডেটাবেসের সাথে কাজ করার জন্য মূল API প্রদান করে, যার মাধ্যমে আপনি ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন, কুয়েরি, মাইগ্রেশন, এবং আরও অনেক কার্যক্রম পরিচালনা করতে পারেন।

DbContext কী?

DbContext হলো Entity Framework এর একটি ক্লাস যা ডেটাবেসের সাথে যোগাযোগের কাজ করে এবং আপনার Entity Classes এর প্রতিনিধিত্বকারী DbSet প্রপার্টিগুলির মাধ্যমে ডেটাবেসের টেবিলগুলির সাথে যোগাযোগ স্থাপন করে। এটি মূলত একটি এন্টিটি ম্যানেজার, যা ডেটাবেসের সাথে সমস্ত অ্যাক্সেস পরিচালনা করে। DbContext ক্লাসে সমস্ত CRUD অপারেশন যেমন ডেটা ইনসার্ট, আপডেট, ডিলিট, এবং রিড করা যায়।


DbContext Class

Entity Framework-এ DbContext ক্লাসটি Entity Framework এর কাজ করার মূল অংশ। এটি ডেটাবেসের সাথে সংযোগ স্থাপন, ডেটাবেস টেবিলগুলোর সাথে যোগাযোগ, কুয়েরি চালানো এবং ডেটাবেসে পরিবর্তন সংরক্ষণ করার জন্য বিভিন্ন পদ্ধতি এবং বৈশিষ্ট্য সরবরাহ করে। DbContext ক্লাসটি একটি C# ক্লাস, এবং এটি Entity Framework এর মূল ফাংশনালিটি পরিচালনা করে।

DbContext ক্লাসের মূল উপাদান

DbContext ক্লাসের প্রধান দুটি উপাদান হলো:

  1. DbSet
    এটি ডেটাবেসের একটি টেবিলের প্রতিনিধিত্বকারী একটি প্রপার্টি। প্রতিটি DbSet একটি Entity Class এর প্রতিনিধিত্ব করে, এবং এটি ডেটাবেসে সংশ্লিষ্ট টেবিলের সাথে যুক্ত থাকে। উদাহরণস্বরূপ, যদি আপনার একটি Student Entity Class থাকে, তবে আপনি একটি DbSet এর মাধ্যমে এই Entity কে ডেটাবেসে ম্যাপ করতে পারেন।
  2. SaveChanges()
    এটি ডেটাবেসে সমস্ত পরিবর্তন সেভ করে। আপনি যখন DbContext এর মাধ্যমে কোনও ডেটা পরিবর্তন করেন, যেমন একটি নতুন Entity যোগ করা, অথবা একটি Entity আপডেট করা, তখন আপনাকে SaveChanges() মেথড কল করতে হবে যাতে এই পরিবর্তনগুলি ডেটাবেসে সঠিকভাবে সংরক্ষণ হয়।

DbContext ক্লাস তৈরি করা

ডেভেলপাররা সাধারণত DbContext ক্লাসটি তাদের প্রোজেক্টের জন্য তৈরি করে, যাতে Entity Framework এর মাধ্যমে ডেটাবেসের সাথে কাজ করা সহজ হয়।

DbContext ক্লাসের উদাহরণ

ধরা যাক, আমরা একটি স্কুল ম্যানেজমেন্ট সিস্টেম তৈরি করছি এবং সেখানে ছাত্রদের তথ্য সংরক্ষণ করতে হবে। আমরা SchoolContext নামক DbContext ক্লাস তৈরি করব।

public class SchoolContext : DbContext
{
    public DbSet<Student> Students { get; set; } // Student টেবিলের জন্য DbSet
    public DbSet<Course> Courses { get; set; }   // Course টেবিলের জন্য DbSet

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // ডেটাবেসের কানেকশন স্ট্রিং প্রদান করা
        optionsBuilder.UseSqlServer("your_connection_string_here");
    }

    // মডেল কনফিগারেশন এবং অন্যান্য কাস্টমাইজেশন
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
            .Property(s => s.Name)
            .IsRequired()
            .HasMaxLength(100);
    }
}

এখানে:

  • SchoolContext ক্লাসটি DbContext থেকে উত্তরাধিকারী।
  • Students এবং Courses দুটি DbSet, যা Entity Classes (Student এবং Course) এর প্রতিনিধিত্ব করছে।
  • OnConfiguring() মেথডের মাধ্যমে ডেটাবেস কানেকশন স্ট্রিং কনফিগার করা হয়েছে।
  • OnModelCreating() মেথডে মডেল কনফিগারেশন করা হয়েছে, যেমন Student ক্লাসের Name প্রপার্টি জন্য একটি কাস্টম কনফিগারেশন।

DbContext-এ CRUD অপারেশন

DbContext ব্যবহার করে আপনি খুব সহজেই ডেটাবেসে CRUD অপারেশন সম্পাদন করতে পারেন। নিচে এর কিছু সাধারণ উদাহরণ দেওয়া হলো।

Create Operation (Create নতুন Entity)

using (var context = new SchoolContext())
{
    var student = new Student
    {
        Name = "John Doe",
        Age = 21
    };

    context.Students.Add(student);  // Add Student to DbSet
    context.SaveChanges();  // ডেটাবেসে পরিবর্তন সেভ
}

এখানে:

  • Add() মেথড ব্যবহার করে নতুন Student Entity যোগ করা হয়েছে।
  • SaveChanges() মেথড ব্যবহার করে এই পরিবর্তন ডেটাবেসে সেভ করা হয়েছে।

Read Operation (ডেটাবেস থেকে Entity পড়া)

using (var context = new SchoolContext())
{
    var student = context.Students
                         .FirstOrDefault(s => s.Name == "John Doe");

    Console.WriteLine($"Name: {student.Name}, Age: {student.Age}");
}

এখানে:

  • FirstOrDefault() মেথড ব্যবহার করে Name এর মান "John Doe" এর সাথে মেলে এমন প্রথম Student Entity পড়া হয়েছে।

Update Operation (Entity আপডেট করা)

using (var context = new SchoolContext())
{
    var student = context.Students.FirstOrDefault(s => s.Name == "John Doe");
    if (student != null)
    {
        student.Age = 22;  // Student এর বয়স আপডেট করা
        context.SaveChanges();  // পরিবর্তন সেভ করা
    }
}

এখানে:

  • SaveChanges() মেথড ব্যবহার করে ডেটাবেসে Entity এর আপডেট সংরক্ষণ করা হয়েছে।

Delete Operation (Entity মুছে ফেলা)

using (var context = new SchoolContext())
{
    var student = context.Students.FirstOrDefault(s => s.Name == "John Doe");
    if (student != null)
    {
        context.Students.Remove(student);  // Student Entity মুছে ফেলা
        context.SaveChanges();  // পরিবর্তন সেভ করা
    }
}

এখানে:

  • Remove() মেথড ব্যবহার করে Student Entity মুছে ফেলা হয়েছে এবং SaveChanges() মেথড দিয়ে ডেটাবেসে এই পরিবর্তন সেভ করা হয়েছে।

DbContext এবং ডেটাবেসের মধ্যে সম্পর্ক

DbContext ডেটাবেসের সিঙ্ক্রোনাইজেশন বজায় রাখে এবং Entity Class গুলি এবং ডেটাবেসের টেবিলগুলির মধ্যে একটি সম্পর্ক স্থাপন করে। আপনি যখন DbContext ব্যবহার করেন, তখন EF সেই সম্পর্কটি টেবিলের কাঠামো (schema) অনুযায়ী অ্যাক্সেস এবং আপডেট করে।

common.content_added_by

DbContext কী এবং এটি কিভাবে কাজ করে

182
182

DbContext হল Entity Framework (EF) এর একটি অত্যন্ত গুরুত্বপূর্ণ ক্লাস, যা ডেটাবেসের সাথে আপনার অ্যাপ্লিকেশনের ইন্টারঅ্যাকশন পরিচালনা করে। এটি ORM (Object-Relational Mapping) ব্যবস্থার একটি মূল উপাদান, যা আপনাকে অবজেক্ট (Objects) এবং রিলেশনাল ডেটাবেস টেবিলগুলির মধ্যে ডেটা ট্রান্সফার করতে সাহায্য করে। DbContext ক্লাসটি ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন করার জন্য ব্যবহৃত হয় এবং এটি ডেটাবেস টেবিলগুলির সাথে কাজ করতে DbSet সমূহকে ব্যবহার করে।


DbContext এর ভূমিকা

  1. ডেটাবেস কনফিগারেশন
    DbContext, ডেটাবেসের সংযোগ (connection) এবং কনফিগারেশন পরিচালনা করে। এটি ডেটাবেসে সংযোগ তৈরি করতে এবং ডেটাবেসে কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়।
  2. ডেটাবেস টেবিলের প্রতিনিধিত্ব
    DbContext ক্লাসের মাধ্যমে আপনি আপনার ডেটাবেস টেবিলগুলোর প্রতিনিধিত্ব করতে পারবেন, যেখানে প্রতিটি DbSet একটি ডেটাবেস টেবিল বা ভিউ বা স্টোরড প্রোসিজারের প্রতিনিধিত্ব করে।
  3. CRUD অপারেশন
    DbContext এর মাধ্যমে আপনি ডেটাবেসে তথ্য যোগ করা, পড়া, পরিবর্তন করা এবং মুছে ফেলা (CRUD অপারেশন) করতে পারবেন।
  4. ডেটাবেস পরিবর্তন ট্র্যাকিং
    এটি অবজেক্টের স্টেট ট্র্যাক করে, অর্থাৎ, অবজেক্টের কোনো পরিবর্তন হলে (যেমন Insert, Update, Delete) DbContext সেই পরিবর্তনগুলো ডেটাবেসে প্রপাগেট (propagate) করতে সহায়তা করে।

DbContext কিভাবে কাজ করে

DbContext কাজ করার জন্য কিছু মূল উপাদান রয়েছে। চলুন এগুলির সাথে পরিচিত হওয়া যাক:


DbContext ক্লাস তৈরি করা

প্রথমে একটি DbContext ক্লাস তৈরি করতে হয়, যা আপনার ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করবে। নিচে একটি সাধারণ DbContext ক্লাসের উদাহরণ দেওয়া হলো:

public class MyDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Product> Products { get; set; }

    // DbContext এর কনফিগারেশন এখানে করা যাবে
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("your_connection_string_here");
    }

    // মডেল কনফিগারেশন করতে OnModelCreating মেথডটি ওভাররাইড করা যায়
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

এখানে:

  • DbSet: এটি একটি প্রপার্টি যা ডেটাবেস টেবিলের প্রতিনিধিত্ব করে। User এবং Product হল Entity ক্লাস যেগুলির মধ্যে ডেটা ম্যানেজ করা হবে।
  • OnConfiguring: এই মেথডের মাধ্যমে ডেটাবেসের সংযোগ স্ট্রিং কনফিগার করা হয়।
  • OnModelCreating: এই মেথডের মাধ্যমে মডেল কনফিগারেশন এবং সম্পর্ক নির্ধারণ করা হয়।

DbContext এর প্রধান কাজ

  1. ডেটাবেসের সাথে সংযোগ তৈরি করা
    DbContext ডেটাবেসের সাথে সংযোগ করতে UseSqlServer() বা অন্য ডাটাবেস ড্রাইভার ব্যবহার করে কনফিগার করা হয়। যখন আপনি DbContext ব্যবহার করেন, তখন এটি ডেটাবেসের সাথে স্বয়ংক্রিয়ভাবে সংযোগ স্থাপন করে।
  2. ডেটা প্রবাহ পরিচালনা করা (Tracking Changes)
    DbContext ক্লাসটি ডেটাবেসের মধ্যে পরিচালিত সব ডেটার স্টেট ট্র্যাক করে। অর্থাৎ, যদি আপনি কোনো Entity ক্লাসের একটি অবজেক্টে পরিবর্তন করেন, তাহলে DbContext সেই পরিবর্তনগুলো ডেটাবেসে সেভ করতে জানায়।

    উদাহরণ:

    var user = context.Users.First();
    user.Name = "New Name";
    context.SaveChanges();  // Save changes to database
    
  3. CRUD অপারেশন সম্পাদন করা
    DbContext এর মাধ্যমে Create, Read, Update, এবং Delete (CRUD) অপারেশন করা যায়। এর জন্য DbSet<TEntity> ব্যবহার করা হয়।
    • Create (ডেটা যোগ করা):

      var newUser = new User { Name = "John" };
      context.Users.Add(newUser);
      context.SaveChanges();
      
    • Read (ডেটা পড়া):

      var user = context.Users.FirstOrDefault(u => u.Name == "John");
      
    • Update (ডেটা আপডেট করা):

      var user = context.Users.First();
      user.Name = "Updated Name";
      context.SaveChanges();
      
    • Delete (ডেটা মুছে ফেলা):

      var user = context.Users.First();
      context.Users.Remove(user);
      context.SaveChanges();
      
  4. ডেটাবেসের আপডেট ট্র্যাক করা
    DbContext কোন Entity এর মধ্যে পরিবর্তন হলে সেগুলো ট্র্যাক করে এবং SaveChanges() মেথডের মাধ্যমে সেই পরিবর্তনগুলো ডেটাবেসে সেভ করে।

DbContext এর সাথে সম্পর্ক

DbContext এর সাথে সম্পর্ক (Relationships) ব্যবস্থাপনা করা যায়। যেমন, One-to-Many, Many-to-Many, এবং One-to-One সম্পর্ক।

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    public ICollection<Order> Orders { get; set; } // One-to-Many relationship
}

public class Order
{
    public int Id { get; set; }
    public string Product { get; set; }
    public int UserId { get; set; }

    public User User { get; set; }  // Foreign key relationship
}

এখানে, User এবং Order এর মধ্যে One-to-Many সম্পর্ক রয়েছে।


DbContext Lifecycle

DbContext একটি সংক্ষিপ্ত লাইফসাইকেল থাকে, যেখানে এটি ইনস্ট্যানশিয়েট (instantiate) হওয়ার পর ডেটাবেসে ইন্টারঅ্যাক্ট করে এবং শেষ হলে ডিসপোজ (dispose) হয়ে যায়।

  • Scope: এটি সাধারণত একে Unit of Work হিসেবে ব্যবহার করা হয়, যেখানে একটিভ ডেটাবেস অপারেশন বা ট্রানজেকশন (transaction) এক DbContext এর মাধ্যমে পরিচালনা করা হয়।
  • Dispose: DbContext ইনস্ট্যান্সটি ব্যবহারের পর ডেটাবেস সংযোগটি বন্ধ করতে Dispose() মেথড কল করা হয়।

DbContext এর সুবিধা

  • Automated Change Tracking: DbContext স্বয়ংক্রিয়ভাবে Entity এর পরিবর্তন ট্র্যাক করে এবং SaveChanges() এর মাধ্যমে সেগুলো ডেটাবেসে সেভ করে।
  • CRUD অপারেশন সহজ করা: ডেটাবেসে CRUD অপারেশন করার জন্য অনেক কোড লেখার প্রয়োজন হয় না। DbSet<TEntity> ব্যবহার করে খুব সহজেই এসব অপারেশন করা যায়।
  • ডেটাবেস কনফিগারেশন এবং মডেল ম্যানেজমেন্ট: DbContext আপনাকে ডেটাবেস কনফিগারেশন এবং Entity গুলোর মডেল ম্যানেজমেন্ট সুবিধা প্রদান করে।

সারাংশ

DbContext হল Entity Framework এর একটি শক্তিশালী উপাদান, যা ডেটাবেসের সাথে আপনার অ্যাপ্লিকেশনের ইন্টারঅ্যাকশন পরিচালনা করে। এটি ডেটাবেসের কনফিগারেশন, CRUD অপারেশন, এবং ডেটাবেস পরিবর্তন ট্র্যাকিংয়ের কাজ করে এবং ORM প্রযুক্তি ব্যবহারে ডেটাবেস অ্যাক্সেসকে খুব সহজ এবং কার্যকর করে তোলে।

common.content_added_by

DbSet ব্যবহার করে Database Table কে Represent করা

232
232

Entity Framework (EF) এর মাধ্যমে, DbSet একটি গুরুত্বপূর্ণ কনসেপ্ট যা ডেটাবেস টেবিলের প্রতিনিধিত্ব (representation) করে। DbSet ক্লাসের মাধ্যমে আপনি আপনার মডেল ক্লাসের সাথে ডেটাবেসের টেবিলের সম্পর্ক স্থাপন করতে পারেন। একক শব্দে, DbSet একটি জেনেরিক কলেকশন যা একটি নির্দিষ্ট টাইপের অর্‌ডারিং, ফিল্টারিং এবং কুয়েরি অপারেশন করার জন্য ব্যবহৃত হয়।

EF-এর মাধ্যমে ডেটাবেস টেবিলের সাথে কাজ করতে DbSet ব্যবহার করা হয়। যখন আপনি DbSet তৈরি করেন, তখন আপনি সেই টেবিলের সমস্ত রেকর্ডের উপর CRUD (Create, Read, Update, Delete) অপারেশন করতে পারবেন।


DbSet কী এবং কীভাবে এটি কাজ করে

DbSet একটি জেনেরিক ক্লাস যা আপনার মডেল ক্লাস (যেমন Student, Course ইত্যাদি) কে ডেটাবেস টেবিলের সাথে ম্যাপ করে। এই ক্লাসের মাধ্যমে আপনি মডেল ক্লাসের প্রতিটি ইনস্ট্যান্সকে টেবিলের রেকর্ড হিসেবে পরিচালনা করতে পারেন।

এখানে একটি উদাহরণ দেওয়া হলো, যেখানে DbSet ব্যবহার করে একটি Student টেবিলকে ডেটাবেসের সাথে যুক্ত করা হয়েছে:

DbSet এর উদাহরণ

  1. Student ক্লাস তৈরি করা: প্রথমে একটি Student ক্লাস তৈরি করি, যা একটি Entity হিসেবে কাজ করবে।

    public class Student
    {
        public int StudentId { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
  2. DbContext ক্লাসে DbSet যোগ করা: এখন, DbContext ক্লাসে DbSet<Student> তৈরি করে এই মডেলটি ডেটাবেসের টেবিলের সাথে সম্পর্ক স্থাপন করা হবে। DbContext হল EF-এর একটি মূল ক্লাস, যা ডেটাবেস অপারেশন পরিচালনা করে।

    public class SchoolContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=.\SQLExpress;Database=SchoolDb;Trusted_Connection=True;");
        }
    }
    

    এখানে, Students হচ্ছে DbSet<Student> যা Student টেবিলের প্রতিনিধিত্ব করে। DbSet ব্যবহার করে আপনি টেবিলের রেকর্ডে অ্যাক্সেস এবং অপারেশন করতে পারেন।

  3. DbSet এর মাধ্যমে ডেটাবেসে CRUD অপারেশন করা: DbSet এর মাধ্যমে আপনি নিম্নলিখিত CRUD অপারেশনগুলো করতে পারেন:

    • Create: নতুন রেকর্ড তৈরি করা।
    using (var context = new SchoolContext())
    {
        var student = new Student { Name = "John Doe", Age = 22 };
        context.Students.Add(student);
        context.SaveChanges();
    }
    
    • Read: ডেটাবেস থেকে রেকর্ড পড়া।
    using (var context = new SchoolContext())
    {
        var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
        Console.WriteLine(student?.Name);
    }
    
    • Update: ডেটাবেসের রেকর্ড আপডেট করা।
    using (var context = new SchoolContext())
    {
        var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
        if (student != null)
        {
            student.Age = 23;
            context.SaveChanges();
        }
    }
    
    • Delete: ডেটাবেস থেকে রেকর্ড মুছে ফেলা।
    using (var context = new SchoolContext())
    {
        var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
        if (student != null)
        {
            context.Students.Remove(student);
            context.SaveChanges();
        }
    }
    

DbSet এর অন্যান্য ব্যবহার

DbSet কেবল CRUD অপারেশনেই সীমাবদ্ধ নয়, আপনি এর মাধ্যমে আরও উন্নত কুয়েরি অপারেশনও করতে পারেন। উদাহরণস্বরূপ:

  1. LINQ কুয়েরি ব্যবহার করা: LINQ এর সাহায্যে DbSet থেকে ডেটা ফিল্টার, গ্রুপ, এবং অর্ডার করা যায়।

    using (var context = new SchoolContext())
    {
        var students = context.Students
                              .Where(s => s.Age > 18)
                              .OrderBy(s => s.Name)
                              .ToList();
        foreach (var student in students)
        {
            Console.WriteLine(student.Name);
        }
    }
    
  2. Include Method ব্যবহার করে Related Data লোড করা: যদি আপনার মডেল ক্লাসে সম্পর্কিত (related) টেবিল থাকে, তবে Include মেথড ব্যবহার করে আপনি একাধিক টেবিলের ডেটা লোড করতে পারেন।

    using (var context = new SchoolContext())
    {
        var students = context.Students
                              .Include(s => s.Courses)  // Assuming Student has a related Courses table
                              .ToList();
        foreach (var student in students)
        {
            Console.WriteLine(student.Name);
            foreach (var course in student.Courses)
            {
                Console.WriteLine(course.Name);
            }
        }
    }
    
  3. Asynchronous Operations: DbSet এর মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস অপারেশনও করতে পারেন, যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে।

    using (var context = new SchoolContext())
    {
        var students = await context.Students.ToListAsync();
        foreach (var student in students)
        {
            Console.WriteLine(student.Name);
        }
    }
    

সারসংক্ষেপ

DbSet Entity Framework এর একটি গুরুত্বপূর্ণ অংশ যা আপনার ডেটাবেস টেবিলের প্রতিনিধিত্ব করে এবং আপনাকে সেই টেবিলের উপর CRUD অপারেশন করতে সক্ষম করে। DbContext ক্লাসের মধ্যে DbSet তৈরি করে, আপনি ডেটাবেসের সাথে কাজ করতে পারেন এবং LINQ বা অন্যান্য পদ্ধতি ব্যবহার করে ডেটা কুয়েরি, ফিল্টারিং, এবং অর্ডারিং করতে পারেন। এটি Entity Framework এর মাধ্যমে ডেটাবেস ম্যানেজমেন্টকে আরও সহজ এবং শক্তিশালী করে তোলে।

common.content_added_by

OnModelCreating মেথড দিয়ে Custom Configuration

186
186

OnModelCreating মেথডটি DbContext ক্লাসে একটি বিশেষ মেথড, যা Entity Framework এর মাধ্যমে মডেল কনফিগারেশন এবং টেবিল সম্পর্কিত বিভিন্ন কাস্টমাইজেশন সেট করার জন্য ব্যবহৃত হয়। এই মেথডের মধ্যে আপনি Fluent API ব্যবহার করে Entity গুলোর মধ্যে সম্পর্ক, কাস্টম মডেল কনফিগারেশন, এবং অন্যান্য ডেটাবেস কনফিগারেশন সেট করতে পারেন।


OnModelCreating মেথডে Custom Configuration কিভাবে কাজ করে

১. OnModelCreating মেথড এর ব্যাখ্যা

OnModelCreating মেথডটি DbContext ক্লাসের একটি অংশ যা Entity Framework কে মডেল কনফিগারেশন নির্ধারণ করতে সাহায্য করে। এটি এমন একটি জায়গা যেখানে আপনি টেবিলের কাঠামো, কলামের ডেটা টাইপ, প্রাইমারি কি, ফরেন কি এবং অন্যান্য কাস্টম কনফিগারেশন সেট করতে পারেন।

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    // Custom Configuration
}

২. Fluent API ব্যবহার করে কাস্টম কনফিগারেশন

Fluent API হল Entity Framework এর একটি শক্তিশালী বৈশিষ্ট্য, যা মডেল কনফিগারেশন করতে সাহায্য করে। OnModelCreating মেথডে আপনি Fluent API এর মাধ্যমে টেবিলের গঠন, কনস্ট্রেইন্ট, রিলেশনশিপ ইত্যাদি কাস্টমাইজ করতে পারবেন।

কিছু সাধারণ কাস্টম কনফিগারেশন:

৩. প্রাইমারি কি কনফিগার করা

যখন Entity Class এ প্রাইমারি কি ডিফাইন করা না থাকে, তখন আপনি Fluent API এর মাধ্যমে এটি কনফিগার করতে পারেন।

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasKey(s => s.StudentId);
}

এখানে, HasKey() মেথডটি StudentId ফিল্ডকে প্রাইমারি কি হিসেবে কনফিগার করছে।

৪. ফরেন কি কনফিগার করা

ফরেন কি সম্পর্ক Entity গুলোর মধ্যে কনফিগার করতে Fluent API ব্যবহার করা যায়। উদাহরণস্বরূপ, যদি Student ক্লাসে Course নামে একটি ফরেন কি সম্পর্ক থাকে, তাহলে এটি কনফিগার করতে হবে।

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasOne(s => s.Course)
        .WithMany(c => c.Students)
        .HasForeignKey(s => s.CourseId);
}

এখানে, HasOne() এবং WithMany() মেথডগুলি ব্যবহার করে Student এবং Course ক্লাসের মধ্যে সম্পর্ক স্থাপন করা হয়েছে। এছাড়া, CourseId ফরেন কি হিসেবে ব্যবহার করা হয়েছে।

৫. কাস্টম কনস্ট্রেইন্ট সংযোজন

যদি আপনি Entity ফিল্ডের জন্য কিছু কাস্টম কনস্ট্রেইন্ট দিতে চান, যেমন Age ফিল্ডে একটি নির্দিষ্ট মানের সীমা, তাহলে তা Fluent API এর মাধ্যমে কনফিগার করা যাবে।

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .Property(s => s.Age)
        .HasDefaultValue(18)
        .IsRequired();
}

এখানে, Age প্রপার্টির জন্য ডিফল্ট মান 18 নির্ধারণ করা হয়েছে এবং এটি বাধ্যতামূলক (required) করা হয়েছে।

৬. টেবিলের নাম পরিবর্তন করা

আপনি টেবিলের নাম কাস্টমাইজ করতে Fluent API ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আপনি Student ক্লাসের জন্য টেবিলের নাম পরিবর্তন করতে চান, তাহলে এটি করতে পারেন:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .ToTable("Tbl_Student");
}

এখানে, Student Entity এর জন্য টেবিলের নাম Tbl_Student করা হয়েছে।

৭. কাস্টম ইন্ডেক্স তৈরি করা

Entity Framework দিয়ে আপনি Entity গুলোর জন্য কাস্টম ইন্ডেক্সও তৈরি করতে পারেন। উদাহরণস্বরূপ, যদি আপনি Name ফিল্ডের জন্য একটি ইন্ডেক্স তৈরি করতে চান:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasIndex(s => s.Name)
        .HasName("Index_Name");
}

এখানে, Name ফিল্ডের জন্য একটি ইন্ডেক্স তৈরি করা হয়েছে এবং ইন্ডেক্সের নাম দেওয়া হয়েছে Index_Name

৮. এনাম (Enum) টাইপের প্রপার্টি কনফিগার করা

যদি আপনার Entity তে কোনো Enum টাইপের প্রপার্টি থাকে, আপনি Fluent API এর মাধ্যমে এটি কনফিগার করতে পারেন:

public enum Gender
{
    Male,
    Female,
    Other
}

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public Gender Gender { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .Property(s => s.Gender)
        .HasConversion<string>();
}

এখানে, Gender প্রপার্টি Enum টাইপে ডিফাইন করা হয়েছে এবং এটি string হিসেবে ডেটাবেসে সেভ করা হবে।


সারাংশ

OnModelCreating মেথড দিয়ে Entity Framework Core এ আপনি বিভিন্ন ধরনের কাস্টম কনফিগারেশন করতে পারেন। Fluent API এর মাধ্যমে আপনি ডেটাবেসের টেবিলের গঠন, প্রাইমারি কি, ফরেন কি, কাস্টম কনস্ট্রেইন্ট, টেবিলের নাম, ইন্ডেক্স এবং এনাম প্রপার্টি সহ নানা কনফিগারেশন করতে পারেন। এই কাস্টম কনফিগারেশনগুলি ডেটাবেসের কার্যকারিতা এবং পারফরম্যান্স উন্নত করতে সহায়তা করে।

common.content_added_by

Context Lifecycle এবং Performance Optimization

233
233

Entity Framework (EF) এর মধ্যে DbContext একটি গুরুত্বপূর্ণ অবজেক্ট যা ডেটাবেসের সাথে যোগাযোগের জন্য ব্যবহৃত হয়। এটি ডেটা রিট্রিভ, আপডেট, ইনসার্ট এবং ডিলিট করার কাজটি সম্পাদন করে। তবে, DbContext এর সঠিক ব্যবহার না করলে পারফরম্যান্সের সমস্যা এবং মেমরি লিক সৃষ্টি হতে পারে। এই কারণে, DbContext Lifecycle এবং Performance Optimization খুবই গুরুত্বপূর্ণ বিষয়।


DbContext Lifecycle

DbContext এর lifecycle কীভাবে পরিচালনা করা হয়, তা জানতে হলে এর কার্যপ্রণালীর সাথে পরিচিত হওয়া জরুরি। EF এর DbContext আসলে একটি unit of work pattern এর অংশ, এবং এটি সাধারণত একটি request বা transaction এর মধ্যে ব্যবহৃত হয়।

DbContext এর জীবনচক্র

  1. Create: DbContext একটি নতুন instance তৈরি হয় যখন আপনি নতুন ডেটাবেস অপারেশন শুরু করেন (যেমন dbContext = new ApplicationDbContext() বা ডিপেনডেন্সি ইনজেকশনের মাধ্যমে)।
  2. Use: DbContext এর মধ্যে বিভিন্ন ডেটাবেস অপারেশন যেমন ডেটা রিট্রিভ, আপডেট বা ডিলিট করার জন্য DbContext এর মেথড ব্যবহার করা হয়।
  3. SaveChanges: DbContext এর মাধ্যমে করা সমস্ত পরিবর্তন যখন SaveChanges মেথড কল করা হয়, তখন ডেটাবেসে সেগুলো সেভ হয়।
  4. Dispose: একবার DbContext এর কাজ শেষ হয়ে গেলে, Dispose মেথড কল করে এটি মুক্ত করা হয়। DbContext এর জন্য একটি "scope" থাকতে হবে, বিশেষত ডিপেনডেন্সি ইনজেকশনের মাধ্যমে এটি ব্যবহৃত হলে।

DbContext Instance এর সঠিক ব্যবহার

DbContext কে যথাযথভাবে ব্যবহার না করলে বিভিন্ন সমস্যা তৈরি হতে পারে, যেমন:

  • Memory Leaks: DbContext এর instance যদি দীর্ঘ সময় ধরে জীবিত থাকে, তবে এটি অতিরিক্ত মেমরি ব্যবহার করতে পারে, যার ফলে মেমরি লিক সৃষ্টি হতে পারে।
  • Performance Issues: যদি DbContext একাধিক অপারেশনের জন্য বারবার পুনরায় ইনস্ট্যান্ট করা না হয়, তাহলে এটি unnecessary database queries চালাতে পারে, যা পারফরম্যান্সে প্রভাব ফেলতে পারে।

সঠিক লাইফসাইকেল ম্যানেজমেন্ট

DbContext এর লাইফসাইকেল ম্যানেজমেন্টে কিছু সাধারণ নিয়ম অনুসরণ করা উচিত:

  • Scoped Lifetime: EF এর DbContext সাধারণত scoped lifetimes এ ব্যবহার করা হয়, যেখানে এটি প্রতি HTTP request বা transaction এর জন্য একটি নতুন instance তৈরি হয়। এই পদ্ধতিতে DbContext সঠিক সময়ে Dispose হয়ে যায় এবং মেমরি ম্যানেজমেন্ট ভালো হয়।
  • Transient and Singleton Avoid: DbContext কে singleton বা transient হিসাবে ব্যবহার করা উচিত নয়, কারণ এভাবে এক instance অনেক দিন ধরে জীবিত থাকলে মেমরি ও পারফরম্যান্স সমস্যার সৃষ্টি হয়।

Performance Optimization Techniques

DbContext এর পারফরম্যান্স অপটিমাইজ করতে কিছু গুরুত্বপূর্ণ কৌশল রয়েছে:

1. Eager Loading vs Lazy Loading

  • Eager Loading: যখন আপনি ডেটা লোড করতে চান এবং সম্পর্কিত ডেটা একসাথে লোড করতে চান, তখন Include() মেথড ব্যবহার করে Eager Loading করা যায়। এটি ডেটার সাথে সম্পর্কিত সমস্ত ডেটা একসাথে লোড করে, যার ফলে ফেচিং অপারেশনগুলো কমিয়ে আনা হয়।

    উদাহরণ:

    var orders = dbContext.Orders.Include(o => o.Customer).ToList();
    
  • Lazy Loading: যখন আপনি কোনো সম্পর্কিত ডেটা প্রয়োজনে লোড করেন, এটি Lazy Loading। যদিও এটি কিছুটা পারফরম্যান্স ভালো করতে পারে, তবে অতিরিক্ত database round-trip তৈরি হতে পারে, যেহেতু সম্পর্কিত ডেটা যখন প্রয়োজন তখনই লোড করা হয়।

    উদাহরণ:

    var customerName = order.Customer.Name; // Lazy Loading triggered
    
  • Best Practice: সাধারনত Eager Loading বেশি কার্যকর, কারণ এটি কম database round-trip তৈরি করে এবং সমস্ত সম্পর্কিত ডেটা একসাথে লোড হয়।

2. Query Optimization

ডেটাবেস থেকে ডেটা রিট্রাইভ করার সময় SQL queries অপটিমাইজ করা খুবই গুরুত্বপূর্ণ। কিছু গুরুত্বপূর্ণ কৌশল:

  • Select Only Necessary Columns: প্রয়োজনীয় কলামগুলি ছাড়া অতিরিক্ত কলাম না নির্বাচন করা। Select() মেথড ব্যবহার করে শুধুমাত্র প্রয়োজনীয় ডেটা ফিল্টার করা।

    উদাহরণ:

    var orders = dbContext.Orders
                          .Where(o => o.Status == "Pending")
                          .Select(o => new { o.OrderId, o.CustomerId })
                          .ToList();
    
  • Avoid N+1 Query Problem: N+1 Query Problem তখন ঘটে যখন আপনি একাধিক রেকর্ডের জন্য একই সম্পর্কিত ডেটা বারবার কুয়েরি করেন। Include() মেথডের মাধ্যমে Eager Loading ব্যবহার করে এই সমস্যা এড়ানো যায়।

3. Caching

  • First Level Cache: DbContext এর মধ্যে একবার রিট্রাইভ করা ডেটা first-level cache এ রাখা হয়, যাতে একাধিক বার একই ডেটা রিট্রাইভ করার প্রয়োজন না হয়।
  • Second Level Cache: EF Core তে second-level cache সাপোর্ট নাও থাকতে পারে, তবে আপনি কাস্টম ক্যাশিং মেকানিজম প্রয়োগ করতে পারেন যেমন Redis বা MemoryCache।

4. Compiled Queries

Compiled Queries ব্যবহার করে আপনি ফেচিং কোডের পারফরম্যান্স বাড়াতে পারেন। EF Core তে, আপনি compiled queries ব্যবহার করে পূর্বের কুয়েরি অপটিমাইজ করে রাখতে পারেন, যাতে প্রতিবার কুয়েরি এক্সিকিউট করার সময় নতুন করে পার্সিং বা কনপাইলিং না করতে হয়।

public static readonly Func<ApplicationDbContext, string, IQueryable<Order>> OrdersByStatus = 
    EF.CompileQuery((ApplicationDbContext context, string status) =>
        context.Orders.Where(o => o.Status == status));

এটি কুয়েরির কার্যকারিতা বাড়ায় এবং সময় বাঁচায়।


5. Asynchronous Operations

EF Core তে Asynchronous অপারেশনগুলি ব্যবহার করে আপনি ডেটাবেস অপারেশনগুলিকে non-blocking করতে পারেন, যা অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করে। async/await ব্যবহার করার মাধ্যমে ডেটাবেসের সাথে যোগাযোগ ব্যাকগ্রাউন্ডে করা হয়, ফলে ইউজারের ইন্টারফেস ব্লক হয় না।

var orders = await dbContext.Orders.ToListAsync();

Conclusion

DbContext এর lifecycle সঠিকভাবে পরিচালনা করা এবং পারফরম্যান্স অপটিমাইজেশন কৌশলগুলি অনুসরণ করার মাধ্যমে আপনি আপনার Entity Framework অ্যাপ্লিকেশনের কার্যকারিতা এবং স্কেলেবিলিটি বাড়াতে পারেন। DbContext কে সঠিকভাবে ব্যবহার করা এবং এর লাইফসাইকেল বুঝে চলা প্রয়োজনীয়, যাতে আপনার অ্যাপ্লিকেশন মেমরি ব্যবস্থাপনা এবং ডেটাবেস অপারেশনের পারফরম্যান্স ভাল থাকে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion