হ্যালো হাসিব! এই লেকচারটিতে মূলত দেখানো হয়েছে যে ডাটাবেস একবার তৈরি হয়ে যাওয়ার পর, পরবর্তীতে কিভাবে তাতে নতুন Column যোগ করা বা বাদ দেওয়া যায় (Migration-এর মাধ্যমে)। এর সাথে সাথে Stored Procedure-এ একটি কমন এরর এবং তা ফিক্স করার ধারণাও দেওয়া হয়েছে।
যেহেতু তুমি Linux Environment এবং .NET CLI ব্যবহার করো, আমি সে অনুযায়ী তোমাকে গাইড করছি। চলো লেকচারটির একটি কুইক সামারি দেখে নেওয়া যাক।
📝 Lecture Summary at a Glance
- Adding a New Column: ডাটাবেসে নতুন কলাম যোগ করার জন্য প্রথমে C# Model Class-এ নতুন প্রপার্টি ডিক্লেয়ার করতে হয়। এরপর একটি নতুন Migration রান করে Database Update করতে হয়।
- Migration Builder APIs: জেনারেট হওয়া Migration ফাইলে
Up()মেথডের ভেতরmigrationBuilder.AddColumn()থাকে যা নতুন কলাম তৈরি করে, এবংDown()মেথডেmigrationBuilder.DropColumn()থাকে। - The Stored Procedure Conflict: মডেল ক্লাসে নতুন কলাম অ্যাড করার পর যদি তোমার আগে থেকে বানানো Stored Procedure-এ সেই কলামের নাম না থাকে, তবে EF Core ডাটা ম্যাপ (Materialize) করার সময় এরর থ্রো করবে।
- Fixing the SP: লেকচারার আপাতত SP বাদ দিয়ে LINQ তে ফিরে গেছেন। তবে রিয়েল-ওয়ার্ল্ডে SP ঠিক করার জন্য নতুন মাইগ্রেশন নিয়ে
ALTER PROCEDUREব্যবহার করতে হয়।
🧠 Comprehensive Breakdown & Deep Dive
১. Adding a New Column to Existing Table [Importance: 10/10]
- The “Why”: তোমার অ্যাপ্লিকেশন যখন লাইভে থাকবে, তখন ক্লায়েন্ট নতুন নতুন রিকোয়ারমেন্ট দিতেই পারে। যেমন, “Chatrabash” প্রজেক্টে হঠাৎ করে দরকার হলো ইউজারদের ‘NID Number’ রাখার। তখন তোমাকে বিদ্যমান ডাটাবেস টেবিল না ভেঙেই নতুন কলাম অ্যাড করতে হবে।
💻 Code Implementation:
প্রথমে তোমার Person ক্লাসে প্রপার্টিটি অ্যাড করবে:
public class Person
{
// ... আগের প্রপার্টিগুলো ...
[StringLength(20)]
public string? TIN { get; set; } // Nullable, কারণ পুরনো ইউজারদের TIN নেই।
}
💻 Linux Terminal / VS Code CLI Command:
# ১. মাইগ্রেশন তৈরি করা
dotnet ef migrations add AddTINColumn --project Entities --startup-project CrudExample
# ২. ডাটাবেসে পুশ করা
dotnet ef database update --project Entities --startup-project CrudExample
২. Removing a Column [Importance: 8/10]
- The “Why”: যদি কখনো মনে হয় কোনো কলাম আর দরকার নেই, তখন সেটি ডিলিট করতে হয়।
- প্রসেস: জাস্ট তোমার C#
Personক্লাস থেকেTINপ্রপার্টিটি মুছে ফেলবে এবং আগের মতোইmigrations add RemoveTINColumnওdatabase updateরান করবে। Migration ফাইলটি নিজে থেকেইmigrationBuilder.DropColumn()জেনারেট করে নেবে।
৩. The Stored Procedure Materialization Error [Importance: 9/10]
- The “Why”: লেকচারার যখন নতুন কলাম (TIN) অ্যাড করার পর প্রজেক্ট রান করলেন, তখন একটি এরর পেলেন: “The required column TIN was not present in the results…”।
- Reason: তোমার
Personমডেল ক্লাসে এখনTINপ্রপার্টি আছে। EF Core আশা করছে যে ডাটাবেস থেকেTINএর ডাটাও আসবে। কিন্তু আমাদের আগের লেকচারে বানানো Stored Procedure (GetAllPersons) এর ভেতরেSELECT PersonId, PersonName...লেখা ছিল, সেখানেTINছিল না। তাই EF Core ডাটা ম্যাপ করতে না পেরে ক্র্যাশ করেছে।
৪. How to Update an Existing Stored Procedure [Importance: 10/10]
- The “Why”: লেকচারার সাময়িক সমাধানের জন্য SP বাদ দিয়ে LINQ ব্যবহার করেছেন। কিন্তু রিয়েল-ওয়ার্ল্ড প্রজেক্টে তো SP বাদ দেওয়া যাবে না। তোমাকে SP আপডেট করতে হবে।
💻 .NET CLI Approach to Update SP: ১. টার্মিনালে একটি ফাঁকা মাইগ্রেশন নাও:
dotnet ef migrations add UpdateGetAllPersonsSP --project Entities --startup-project CrudExample
২. জেনারেট হওয়া মাইগ্রেশন ফাইলে ALTER PROCEDURE ব্যবহার করো:
protected override void Up(MigrationBuilder migrationBuilder)
{
string spSql = @"
ALTER PROCEDURE dbo.GetAllPersons
AS
BEGIN
-- এখানে নতুন TIN কলামটি যুক্ত করা হয়েছে
SELECT PersonId, PersonName, Gender, Address, TIN FROM dbo.persons
END";
migrationBuilder.Sql(spSql);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
// Down এ আগের অবস্থায় (TIN ছাড়া) ফিরিয়ে আনার কোড থাকবে
string spSql = @"
ALTER PROCEDURE dbo.GetAllPersons
AS
BEGIN
SELECT PersonId, PersonName, Gender, Address FROM dbo.persons
END";
migrationBuilder.Sql(spSql);
}
এরপর database update দিলেই তোমার SP আপডেট হয়ে যাবে এবং অ্যাপ্লিকেশন আর ক্র্যাশ করবে না।
🚀 Best Practices
১. Nullable vs Non-Nullable Columns:
যখন কোনো Existing Table (যেখানে আগে থেকেই ১০০টি Row আছে) এ নতুন কলাম অ্যাড করবে, তখন সেটি অবশ্যই Nullable (?) বা একটি Default Value দিয়ে অ্যাড করবে। যদি তুমি required বা Non-nullable কলাম অ্যাড করো, তাহলে SQL Server এরর থ্রো করবে, কারণ আগের ১০০ জন ইউজারের সেই কলামের ডাটা তো ফাঁকা!
২. SP Maintenance: যেকোনো মডেল আপডেট করার পর অবশ্যই চেক করবে যে ওই মডেলের ওপর নির্ভরশীল কোনো Stored Procedure বা Raw SQL Query আছে কিনা। থাকলে সেগুলোও মাইগ্রেশনের মাধ্যমে আপডেট করতে হবে।
পরবর্তী লেকচারে কলামের নাম পরিবর্তন এবং কলামে কনস্ট্রেইন্ট (Constraints) অ্যাড করার বিষয় নিয়ে আলোচনা করা হবে। তুমি রেডি হলে সেই ট্রান্সক্রিপ্টটি দিতে পারো!