Entity Framework (EF) এ Navigational Properties এবং Lazy Loading দুটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। এই দুটি ফিচার ডেটাবেস সম্পর্ক (relationships) পরিচালনায় সাহায্য করে এবং ডেটাবেসের সাথে সম্পর্কিত ডেটা রিট্রাইভ করতে একাধিক উপায় প্রদান করে।
Navigational Properties এমন প্রপার্টি, যা এক Entity থেকে অন্য Entity এর সাথে সম্পর্ক তৈরি করে। EF তে, Navigational Properties এর মাধ্যমে আপনি One-to-One, One-to-Many, এবং Many-to-Many সম্পর্ক তৈরি করতে পারেন। এই প্রপার্টিগুলি সাধারণত Entity ক্লাসের মধ্যে একটি রেফারেন্স হিসেবে থাকে এবং ডেটাবেসের টেবিলগুলোর মধ্যে সম্পর্ক স্থাপন করে।
ধরা যাক, আমাদের একটি Student
এবং Course
টেবিল আছে, যেখানে একজন ছাত্র একাধিক কোর্সে রেজিস্টার করতে পারে। এই সম্পর্ক One-to-Many।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
// Navigational Property for the related Courses
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Foreign Key for the related Student
public int StudentId { get; set; }
public Student Student { get; set; } // Navigational Property
}
এখানে:
Student
ক্লাসে Courses একটি Navigational Property হিসেবে সংজ্ঞায়িত করা হয়েছে, যা ICollection টাইপের, অর্থাৎ একজন ছাত্রের একাধিক কোর্স থাকতে পারে।Course
ক্লাসে Student এবং StudentId
প্রপার্টি রয়েছে, যা Foreign Key হিসেবে কাজ করে এবং Student
Entity এর সাথে সম্পর্ক স্থাপন করে।এইভাবে, আপনি EF এর মাধ্যমে সম্পর্কিত টেবিলের ডেটা একত্রে রিট্রাইভ করতে পারেন।
Lazy Loading হল একটি বৈশিষ্ট্য যা EF তে ডেটা রিট্রাইভ করার সময় নির্দিষ্ট সম্পর্কিত Entity এর ডেটা শুধুমাত্র তখনই লোড হয়, যখন সেটি প্রথমবারের মতো প্রয়োজন হয়। এটি দ্বিতীয় পর্যায়ের লোডিং হিসেবেও পরিচিত, কারণ শুধুমাত্র Navigational Property এর মাধ্যমে অন্য Entity রেফারেন্স করা হলে, EF ঐ Entity এর ডেটা লোড করবে।
Lazy Loading সুবিধা হল যে, এটি যখন প্রয়োজন হবে, তখনই সম্পর্কিত ডেটা লোড হয়, ফলে অপ্রয়োজনীয় ডেটা লোডের ঝামেলা কমে।
Lazy Loading সক্ষম করার জন্য, প্রথমে আপনার Navigational Property গুলিকে virtual করতে হবে, যাতে EF নিজে স্বয়ংক্রিয়ভাবে সম্পর্কিত ডেটা লোড করতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
// Virtual Navigational Property for the related Courses (Enable Lazy Loading)
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Foreign Key for the related Student
public int StudentId { get; set; }
public Student Student { get; set; } // Navigational Property
}
এখানে:
public virtual ICollection<Course> Courses { get; set; }
: virtual কিওয়ার্ডের মাধ্যমে Lazy Loading সক্ষম করা হয়েছে।Lazy Loading চালু করার জন্য DbContext এ অবশ্যই Proxies সক্রিয় থাকতে হবে। এটি EF Core তে ডিফল্টভাবে সক্রিয় থাকে, তবে EF 6 তে কিছু কনফিগারেশন করতে হয়।
যখন আপনি Student
Entity এর Courses প্রপার্টি এক্সেস করবেন, EF তখন স্বয়ংক্রিয়ভাবে Course টেবিলের ডেটা লোড করবে। উদাহরণস্বরূপ:
using (var context = new SchoolContext())
{
var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
// Lazy Loading will load the Courses data when accessed
var courses = student.Courses;
foreach (var course in courses)
{
Console.WriteLine(course.CourseName);
}
}
এখানে, student.Courses
এক্সেস করার সময় EF Courses টেবিলের ডেটা লোড করবে, যদি তা আগে লোড না করা থাকে।
Lazy Loading এবং Eager Loading দুটি আলাদা কৌশল, যা EF তে সম্পর্কিত ডেটা লোড করতে ব্যবহৃত হয়:
using (var context = new SchoolContext())
{
var student = context.Students
.Include(s => s.Courses) // Eager Loading for related Courses
.FirstOrDefault(s => s.StudentId == 1);
foreach (var course in student.Courses)
{
Console.WriteLine(course.CourseName);
}
}
এখানে:
Include(s => s.Courses)
ব্যবহৃত হয়েছে, যা Courses সম্পর্কিত ডেটা একসাথে লোড করবে।EF এ সম্পর্কিত ডেটা লোড করার জন্য Lazy Loading এবং Eager Loading উভয় কৌশলই ব্যবহার করা যায়, তবে প্রতিটি কৌশলের পারফরম্যান্সের পার্থক্য থাকতে পারে, তাই আপনার প্রয়োজনের উপর ভিত্তি করে সঠিক কৌশল নির্বাচন করা গুরুত্বপূর্ণ।
common.read_more