Feb 2, 2017

.NET Framework ထဲက Entity Framework (EF) အကြောင်း

sagaing
.NET ထဲမှာ Entity Framework ဆိုတာ ORM (Object Relational Mapping) Framework တစ်ခုပဲဖြစ်တယ်။  ORM ဆိုတာ Object Oriented ပုံစံဖြင့် Database ထဲက Data တွေကို ကိုင်တွယ်ဆောင်ရွက်တဲ့ နည်းလမ်းပဲဖြစ်တယ်။  EF နှင့် Relational Database ကို ချိတ်ဆက်ပြီး CRUD (Create, Read, Update, Delete) အလုပ်တွေကို လုပ်တဲ့အခါမှာ Code အနည်းငယ်သာ ရေးရန်လိုအပ်တယ်။  EF ဟာ တကယ်တော့ ယခင်က .NET Framework ထဲမှာရှိပြီးသား ADO.NET ပေါ်မှာ ဖန်တီးထားတဲ့အတွက် လုပ်ဆောင်ချက်လည်း ပိုမြန်လာတယ်။

Entity Framework ကိုအသုံးပြုနိုင်ဖို့ ဘယ်လိုပြင်ဆင်မလဲ။
ASP.Net MVC Project အသစ်တစ်ခုယူလိုက်မယ်။  Project အမည်ကို SamplePrjEntityFramework လို့ပေးလိုက်တယ်။  (မှတ်ချက်။ EF ကို MVC မဟုတ်တဲ့ Project မှာလည်း အသုံးပြုလို့ရပါတယ်။)


ပြီးရင် Tools ထဲက NuGet Package Manager ထဲမှာ Package Manager Console ကို Click နှိပ်လိုက်တယ်။


Install-Package EntityFramework ဆိုတဲ့ Command ရိုက်ထည့်ပြီး Enter နှိပ်လိုက်ရင် EF ကို Project ထဲမှာ Install လုပ်ပေးလိမ့်မယ်။  လုပ်ပြီးသွားရင် Get-Package Command နှင့် Install လုပ်ထားတဲ့ Version နှင့် Project ထဲမှာရှိတဲ့ Package တွေကို ပြန်စစ်ကြည့်လို့ရတယ်။  EF Tools ကို ဒီနေရာ ကနေ Download လုပ်လို့လည်းရတယ်။

EF နှင့် Data တွေကို ကိုင်တွယ်ဆောင်ရွက်နိုင်တဲ့ နည်းလမ်းများ
EF ကို အသုံးပြုပြီး Data တွေကို ကိုင်တွယ်ဆောင်ရွက်နိုင်တဲ့နည်းလမ်း (၃) မျိုးရှိတယ်။
၁) Entity တွေကို Code ဖြင့်ရေးပြီး စတင်သည့်နည်းလမ်း။  ၄င်းကို Code First Approach လို့ခေါ်တယ်။  Developer တွေက Entity Class တွေကို Code တွေနှင့်ရေးမယ်။  Entity Class တွေရေးပြီးသွားရင် လိုအပ်တဲ့ Configuration Code တွေရေးမယ်။  စသည်ဖြင့် အကုန်လုံး Code တွေရေးပြီး လုပ်ဆောင်တာမျိုးဖြစ်တယ်။

၂) Entity တွေကို Model ဖြင့် စတင်သည့်နည်းလမ်း။  ၄င်းကို Model First Approach လို့ခေါ်တယ်။  
Model တွေကိုဘယ်လိုဖန်တီးလဲ။
Project Menu ကနေ Add New Item ထဲကိုသွားလိုက်ရင် Data ဆိုတာရှိတယ်။  Data ကနေ ADO.NET Entity Data Model ဆိုတာကို Add လုပ်ပြီး Empty EF Designer model ဆိုတဲ့ Item ကိုအသုံးပြုပြီး Model တွေကိုဖန်တီးနိုင်တယ်။

၃) Entity တွေကို Database ဖြင့် စတင်သည့်နည်းလမ်း။  ၄င်းကို Database First Approach လို့ခေါ်တယ်။ Entity ဆိုတာ Database ထဲမှာတော့ Table ဖြစ်တယ်။ Entity တွေအတွက် Table တွေကို Database ထဲမှာ ဖန်တီးတာမျိုးကိုပြောတာဖြစ်တယ်။  Database ကရှိပြီးသားလည်း ဖြစ်နိုင်တယ်။

Code First Approach ဖြင့် EF ကိုလေ့လာခြင်း။
Entity ဆိုတာ Programming ထဲမှာတော့ Class ပဲဖြစ်ပါတယ်။  တစ်စုံတစ်ခုကို ကိုယ်စားပြုတဲ့ Data Class တစ်ခုလို့ပြောရင် ပိုမှန်မယ်။  MVC မှာတော့ Data Model တစ်ခုလို့ပြောရင် ပိုမှန်မယ်။  အဲ့ဒီတော့ Data Model Class တွေကို အရင်ဦးဆုံး ဖန်တီးပေးရမယ်။  ပုံထဲက Models Folder အောက်မှာပြထားတဲ့အတိုင်း Data Model Class နှစ်ခုဖန်တီးလိုက်မယ်။
Position.cs

Employee.cs

enum ဆိုတာဘာလဲ။
Employee Class ထဲက enum ဆိုတာ C# မှာအသုံးပြုတဲ့ Keyword တစ်ခုဖြစ်ပြီး enumeration လို့ခေါ်တယ်။ enumeration ဆိုတာ မပြောင်းလဲပဲရှိနေတဲ့ Value အစုအဝေးတစ်ခုကို ပြောတာဖြစ်တယ်။ enum Value အစုအဝေးတစ်ခုကို ဖန်တီးပြီး အသုံးပြုထားတဲ့အတွက် Data တွေရဲ့ Type ကိုသေချာစွာ သတ်မှတ်သုံးစွဲနိုင်တယ်။  Employee Class မှာ Gender ခွဲခြားသတ်မှတ်ဖို့ သုံးထားတာဖြစ်တယ်။

virtual ဆိုတာဘာလဲ။
virtual ဆိုတာ C# မှာအသုံးပြုတဲ့ Keyword ဖြစ်ပြီး အခြား Class တွေက Employee Class ကိုခေါ်ယူသုံးစွဲတဲ့အခါမှာ (ဥပမာ။ Inheritance လုပ်သုံးတယ်။) ၄င်းရဲ့ Position ဆိုတဲ့ Property ကို override လုပ်ခွင့်ပေးထားခြင်းပဲဖြစ်တယ်။  Override လုပ်တယ်ဆိုတာ မိမိစိတ်ကြိုက် အဲ့ဒီ Property ကိုပြင်ဆင်၊ ချဲ့ထွင်နိုင်တာမျိုးကိုပြောတာဖြစ်တယ်။

ICollection ဆိုတာဘာလဲ။
Position Class ထဲက ICollection ဆိုတာ Collection Interface တစ်ခုဖြစ်တယ်။  C# မှာ Interface တွေကို I စကားလုံးနှင့်စပြီးသတ်မှတ်ထားတယ်။  Collection Class တွေဖြစ်တဲ့ List တို့ Dictionary တို့ကို သတ်မှတ်အသုံးပြုနိုင်တယ်။  လက်ရှိ Code ထဲမှာရေးထားတဲ့ ICollection<Employee> ဆိုတာ Employees တွေပါတဲ့ List တစ်ခုအတွက် သတ်မှတ်ထားတာဖြစ်တယ်။

Position.cs ထဲက...

public virtual ICollection<Employee> Employees { get; set; }

ဒီ Code ဟာတကယ်တော့ Navigation အတွက် အသုံးပြုတာဖြစ်တယ်။  Entity တွေဆိုတာ တစ်ခုနှင့်တစ်ခု ဆက်သွယ်နေလေ့ရှိတယ်။  အဲ့ဒီ ဆက်သွယ်မှုတွေကို One to Many, Many to One, One to One, Many to Many စသည်ဖြင့်ခေါ်ကြတယ်။  ဒီဆက်သွယ်မှုတွေကို Navigation လို့ခေါ်တယ်။  Employee တစ်ယောက်မှာ Position တစ်ခုရှိနိုင်သလို Position တစ်ခုမှာလည်း Employee တွေအများကြီးရှိနိုင်တယ်ဆိုတဲ့ ဆက်သွယ်မှုကိုပြောတာဖြစ်တယ်။

Database တစ်ခုအတွက် Class တွေဖန်တီးခြင်း
Data Model တွေတည်ဆောက်ပြီးသွားပြီဆိုရင် Database Context လို့ခေါ်တဲ့ Database တစ်ခုဖြစ်ပေါ်ဖို့ဖန်တီးပေးရမယ်။  Project ထဲမှာ DataAccessLayer လို့ခေါ်တဲ့ Folder တစ်ခုတည်ဆောက်လိုက်မယ်။


DataAccessLayer Folder ထဲမှာ EmployeeContext.cs နှင့် EmployeeInitializer.cs ဆိုတဲ့ Class နှစ်ခုဖန်တီးလိုက်မယ်။

EmployeeContext.cs


EmployeeInitializer.cs


DbContext ဆိုတာဘာလဲ။
Entity Framework မှာ အရေးပါပဲ Class တစ်ခုဖြစ်ပြီး Entity Class တွေနှင့် Database ကြားထဲမှာ Data နှင့်ပတ်သက်တဲ့ အလုပ်တွေကို ချိတ်ဆက်ပြီး အပြန်အလှန်လုပ်ဆောင်ပေးမယ့် Class တစ်ခုဖြစ်တယ်။ EmployeeContext ကို DbCotext Class ကနေ Inherit လုပ်ပြီး တည်ဆောက်ထားတာဖြစ်တယ်။  C# မှာ Inherit လုပ်ရင် (:) ကိုအသုံးပြုတယ်။  EmployeeContext ဟာ Derived Class ဖြစ်ပြီး DbContext ဟာ Base Class ဖြစ်တယ်။ base("EmployeeContext") က Database Connection String ကို သတ်မှတ်တာဖြစ်တယ်။  Connection String ကို Web.config ထဲမှာ သတ်မှတ်ပေးရမှာဖြစ်တယ်။  နောက်ပိုင်းမှာ တွေ့နိုင်ပါတယ်။

DbSet ဆိုတာဘာလဲ။
Entity Set တစ်ခုကို DbSet လို့ခေါ်တယ်။  Entity ထဲမှာရှိတဲ့ Data တွေကို CRUD (Create, Read, Update, Delete) အလုပ်တွေကို လုပ်ဖို့အတွက်ဖြစ်တယ်။  Entity Set ဟာ Collection တစ်ခုအနေနှင့်တည်ရှိတာဖြစ်တဲ့အတွက် DbSet<Employee> လို့ရေးပေးရတာဖြစ်တယ်။  အမည်ကိုလည်း Employee တွေ အများကြီးရှိမှာမို့လို့ Employees လို့ပေးလိုက်တယ်။  Database တစ်ခုတည်ဆောက်ပြီးသွားတဲ့အခါမှာ Employees နှင့် Positions ဆိုတဲ့ Table နှစ်ခုကို ရလာမှာဖြစ်တယ်။

Initializer Class က ဘာအတွက်လဲ။
Application ကို Run လိုက်တဲ့အခါမှာ Project မှာ Database မရှိခဲ့ဘူးဆိုရင် DbContext က သူ့မှာရှိတဲ့ DbSet တွေနှင့် Database တစ်ခုကို တည်ဆောက်ပေးမယ်။  Database ကို တည်ဆောက်ပြီးသွားရင် တစ်ချို့ Table တွေထဲမှာ Data တွေကို အဆင်သင့် ထည့်သွင်းပေးထားချင်တဲ့အခါမှာ Initializer Class ကိုဖန်တီးပေးရတယ်။ အခု Initializer Class ရဲ့ Base Class က DropCreateDatabaseIfModelChanges ဖြစ်တယ်။ ဒီ Class လုပ်ပေးမှာက DbContext ကဖန်တီးလိုက်တဲ့ Database ကိုနောက်ပိုင်းမှာ ပြင်ဆင်မှုတွေ လုပ်ခဲ့မယ်ဆိုရင် Database အဟောင်းကိုဖျက်ပြီး Database အသစ်ဖန်တီးတဲ့အလုပ်ကို လုပ်ပေးတယ်။  နောက်ပြီး Data အသစ်တွေထည့်လိုက်ရင်လည်း Database ထဲက Table တွေထဲကို ထည့်ပေးမှာဖြစ်တယ်။  လက်ရှိ Code ထဲမှာတော့ Position (၅)ခုကို ForEach Loop နှင့်ပတ်ထည့်ထားပြီး context.SaveChanges() နှင့်သိမ်းထားတယ်။

Web.config ထဲမှာ Configuration များထည့်သွင်းခြင်း
Database အတွက်လိုအပ်တဲ့ Class တွေဖန်တီးပြီးသွားပြီဆိုရင် Web.config ထဲမှာ Database နှင့်သက်ဆိုင်တဲ့ Configuration တွေသတ်မှတ်ပေးရမယ်။


Web.config ထဲက ပုံမှာပြထားတဲ့အတိုင်း entityFramework tag ထဲမှာ Config ကိုထည့်ပေးရမယ်။


context ထဲက type attribute မှာ SamplePrjEntityFramework.DataAccessLayer namespace အောက်မှာရှိတဲ့ EmployeeContext ကိုသတ်မှတ်ပေးရမယ်။ နောက်ပြီး context အောက်မှာ databaseInitializer ရဲ့ Type မှာလည်း EmployeeInitializer ကိုထည့်ပေးရမယ်။  ဒါတွေပြီးသွားရင် Connection String ထည့်ပေးရမယ်။ ပုံမှာပြထားတဲ့အတိုင်း entityFramework tag အပိတ်ရဲ့ အောက်မှာ ထည့်ပေးလိုက်တယ်။


name မှာ Class အမည်အတိုင်းပဲ EmployeeContext ဆိုပြီးသတ်မှတ်ပေးရမယ်။  connectionString ရဲ့ Data Source မှာ (LocalDb) MSSQLLocalDB လို့သတ်မှတ်ထားတယ်။  LocalDb ဆိုတာ SQL Server Express ထဲက Light Database Engine တစ်ခုပဲဖြစ်တယ်။  Visual Studio Environment မှာအလွယ်တကူ အသုံးပြုလို့ရတဲ့ Database Engine ဖြစ်တယ်။ (မှတ်ချက်။ တကယ်အလုပ်လုပ်တဲ့ Production Environment မှာဆိုရင်တော့ SQL Server ကိုပြန်ပြောင်းပေးရမှာဖြစ်တယ်။)  AttachDBFilename မှာ Database File သိမ်းမယ့်နေရာနှင့် အမည်ကို ညွှန်းပေးထားတယ်။  အမည်ကို Employee ပေးထားပြီး နေရာက Project ထဲက App_Data ဆိုတဲ့ Folder နေရာပဲဖြစ်တယ်။ Initial Catalog မှာ Database အမည်ကိုလည်း EmployeeDB ဆိုပြီး နာမည်ပေးလိုက်တယ်။  လောလောဆယ် Application ထဲမှာ Database ရှိမှာမဟုတ်သေးဘူး။ Application ကို Run မှသာ Project ထဲက App_Data Folder ထဲမှာ .mdf နှင့် Database တစ်ခုကို ဖန်တီးပေးမှာဖြစ်တယ်။ လောလောဆယ် Run လို့ရမှာမဟုတ်သေးဘူး ဘာလို့လည်းဆိုတော့ Project မှာ View နှင့် Controller တွေမရှိသေးတာကြောင့်ဖြစ်တယ်။

Controller နှင့် View တွေဖန်တီးခြင်း
Controller Folder မှာ Right Click နှိပ်ပြီး Add မှ Controller ကို Click နှိပ်လိုက်ရင် Dialog Box တစ်ခုထွက်လာမယ်။  Empty Controller ကိုရွေးလိုက်မယ် ပြီးရင် HomeController လို့အမည်ပေးလိုက်မယ်။


ပြီးရင် View() ပေါ်မှာ Right Click နှိပ်ပြီး Add View နှင့် View တစ်ခုထည့်လိုက်မယ်။  View name မှာ Index လို့ပေးမယ်။  Template မှာ Empty (without model) ကိုရွေးပြီး Add ကိုနှိပ်လိုက်ရင် အခုလို View နှင့် Shared View တွေ့ရလာလိမ့်မယ်။

Index.cshtml ထဲမှာလည်း အခုလိုတွေ့ရလိမ့်မယ်။


Index ကို Home လို့ပြောင်းလိုက်မယ်။  ပြီးရင် Shared အောက်က _Layout.cshtml ထဲမှာ Html ActionLink တစ်ခုထည့်လိုက်မယ်။  Home စာသားနှင့် Home Controller ထဲက Index ဆိုတဲ့ ActionResult ကိုအလုပ်လုပ်မှာဖြစ်တယ်။


ပြီးရင်နောက်ထပ် Controller တစ်ခုကို Controller ပေါ်မှာ Right Click နှိပ်ပြီး ထပ်ထည့်လိုက်မယ်။ 


ဒီ Controller ကိုတော့ Entity Framework ကိုအသုံးပြုမယ့် Controller အမျိုးအစားကိုရွေးပေးရမယ်။


Model class မှာ Employee ကိုရွေးမယ် Data context class မှာ EmployeeContext ကိုရွေးမယ်။  ပြီးရင် Add နှင့်ထည့်လိုက်တယ်။  အားလုံးပြီးသွားတဲ့အခါ Employees View နှင့် Code တွေကို အလိုလျှောက် ဖန်တီးပေးလိမ့်မယ်။



တကယ်တော့ ဒီ Code တွေဟာ Auto Generate လုပ်ပေးသွားတာ ဖြစ်တယ်။  Employee View ကို Link လုပ်ဖို့ _Layout.cshtml ထဲက ActionLink အောက်မှာ နောက်ထပ် ActionLink တစ်ခုထပ်ထည့်လိုက်မယ်။

<li>@Html.ActionLink("Employee", "Index", "Employees")</li>

ပြီးရင် Employee Controller ထဲက Code တွေထဲကတစ်ချို့ Code တွေကို ကြည့်မယ်ဆိုရင်...

private EmployeeContext db = new EmployeeContext();

Controller တစ်ခုထဲမှာ Database ထဲက Data တွေနှင့်ပတ်သက်တဲ့အပိုင်းတွေကို ဆောင်ရွက်ချင်တဲ့အခါမှာ DataAccessLayer ထဲမှာ ရေးထားတဲ့ EmployeeContext Class ကိုခေါ်ပြီးအခုလို အသုံးပြုရတာဖြစ်တယ်။

if (id == null)
{
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

Employee Id က null ဖြစ်ခဲ့ရင် ဆက်လုပ်လို့မရတဲ့အတွက် HttpStatusCodeResult တစ်ခုကို return ပြန်ပေးတာ ဖြစ်တယ်။  HttpStatusCodeResult instance ထဲမှာ HttpStatusCode parameter ထည့်ပေးရမယ်။ HttpStatusCode ထဲမှာ enum values တွေပါတယ်။  လက်ရှိ Code ထဲမှာတော့ BadRequest ဆိုတဲ့ enum value ကိုအသုံးပြုထားတယ်။

ValidateAntiForgeryToken
Create, Edit, DeleteConfirmed စတဲ့ Post Action (၃)ခုမှာ အသုံးပြုထားတဲ့ Attribute တစ်ခုဖြစ်တယ်။ Data တွေပါတဲ့ Form Request တစ်ခုကို Server ဆီပို့တဲ့အခါမှာ မှန်ကန်မှုမရှိတဲ့ Data တွေကိုလက်မခံပဲ ကာကွယ်ပေးတဲ့ Attribute တစ်ခုပဲဖြစ်တယ်။  အဓိကကာကွယ်ပေးတာက Cross-Site Attack လို့ခေါ်တဲ့ Script တွေကို Data တွေနှင့်အတူထည့်သွင်းပြီး Website ကိုတိုက်ခိုက်ခြင်းတွေကိုပဲဖြစ်တယ်။

Bind Attribute
Edit နှင့် Create Post Action တွေမှာ Bind Attribute ကိုအသုံးပြုထားပြီး သူ့နောက်မှာ Employee Model သတ်မှတ်ထားတယ်။  Model ထဲက အသုံးပြုချင်တဲ့ Property တွေကို သတ်မှတ်ပြီးအသုံးပြုတာပဲဖြစ်တယ်။

Record ရှာဖွေခြင်း
Table တစ်ခုထဲမှာရှိတဲ့ Record တွေကိုရှာဖွေတဲ့အခါမှာ Find နှင့်ရှာရပါတယ်။  Primary Key သတ်မှတ်ထားတဲ့ Field ကို Find ထဲမှာထည့်ပေးရမှာဖြစ်ပါတယ်။

Employee employee = db.Employees.Find(id);

Record အသစ်ထည့်ခြင်း
Table ထဲကို Record တွေထည့်တဲ့အခါမှာ Add နှင့်ထည့်ပါတယ်။  ပြီးရင်တော့ SaveChanges နှင့် သိမ်းပေးရပါတယ်။

db.Employees.Add(employee);
db.SaveChanges();

Record ဖျက်ခြင်း
Table ထဲမှာရှိပြီးသား Record တစ်ခုကို ဖျက်ချင်တဲ့အခါမှာ၊ ဖျက်ချင်တဲ့ Record ကိုရှာဖွေပြီး Remove နှင့် ဖျက်နိုင်ပါတယ်။  ပြီးသွားရင်တော့ SaveChanges နှင့်ပြန်သိမ်းပေးရပါတယ်။

db.Employees.Remove(employee);
db.SaveChanges();

Entity Framework နှင့် Database ကိုကိုင်တွယ်ပြီး အလုပ်လုပ်တဲ့အခါမှာ Code အများကြီးရေးစရာ မလိုတဲ့အတွက် အချိန်ကုန်သက်သာသွားပါတယ်။

Application ကို Run ခြင်း
Application ကို စတင် Run လိုက်တဲ့အခါမှာ Home Controller ရဲ့ Index View အရင်ပေါ်လာပါလိမ့်မယ်။

Employee ကို သွားလိုက်ရင် Employee Controller ရဲ့ Index ကိုအလုပ်လုပ်တဲ့အခါမှာ Employee List ကို View ထဲမှာပြထားတာဖြစ်တဲ့အတွက် Table တစ်ခုအနေနှင့် ပြပေးမှာဖြစ်တယ်။

Employee Controller ကို စတင်အလုပ်လုပ်တာနှင့် Database ဖိုင်ကို Project ထဲက App_Data Folder ထဲမှာ ဖန်တီးပေးမှာဖြစ်ပါတယ်။


Create New နှင့် Employee Record အသစ်တစ်ခုထည့်ကြည့်လိုက်တယ်။

Create ကို Click နှိပ်လိုက်တယ်...

Employee Record တစ်ခုဝင်သွားတယ်။  Table ရဲ့ ညာဘက်မှာ Edit, Detail နှင့် Delete ဆိုတဲ့ Links တွေပေါ်လာမယ်။   ထည့်လိုက်တဲ့ Record ဟာ Database ထဲကိုရောက်မရောက် စစ်ကြည့်ချင်တယ်ဆိုရင် SQL Server Object Explorer မှတဆင့် Table ထဲမှာ စစ်ကြည့်လို့ရတယ်။


တကယ်တော့ ဒီ Application ဟာပြီးပြည့်စုံတဲ့ Application တစ်ခုတော့မဟုတ်သေးပါဘူး။  Application မှာ လိုအပ်ချက်တွေ ရှိနေပါသေးတယ်။  Entity Framework နှင့်ပတ်သက်လို့ကတော့ ဒီလောက်ပါပဲ။

မှတ်စုရေးသူအကြောင်း

sagaing / Software Engineer

နာမည်အရင်းမှာ လှိုင်မင်းထက်ဖြစ်ပြီး၊ ကိုစစ်ကိုင်းဆိုသည့် နာမည်ပြောင်နှင့် မိတ်ဆွေ၊ သူငယ်ချင်းများက ရင်းနှီးစွာခေါ်ကြပါသည်။ ယခင်ကမြန်မာနိုင်ငံတွင် သင်ကြားရေး နှင့် Software Development လုပ်ငန်းများတွင် ဝင်ရောက်လုပ်ကိုင်ခဲ့ပြီး၊ ယခုလက်ရှိမှာ စင်ကာပူနိုင်ငံရှိ နည်းပညာကုမ္ပဏီတစ်ခုတွင် ဝင်ရောက်လုပ်ကိုင်နေပါသည်။

1 ခုမှတ်ချက်ပေးထားတယ်။:

ကိုစစ်ကိုင်း၏ မှတ်စုများ. Powered by Blogger.