ููููุง ูุจู ูุฏุง ุงููุง ู ู ูู ูุนู ู Mapping ู ู ุงูู Database ููููุฏ ูุงูุนูุณุ ูุฏุง ุจูุนุชู ุฏ ุงูุช ุดุบุงู Code-first or Database-First.
ููุฑูุฒ ุนูู ุทุฑููุฉ ุงูู Code-First. ุงูุทุฑููุฉ ุฏู ู ุนูุงูุง ุฅููุง ุจูุจุฏุฃ ุจูุชุงุจุฉ ุงูู Classes ุจุชุงุนุชูุง ุจูุบุฉ C# ุงูุฃููุ ูุจุนุฏูู ุจูุนุชู ุฏ ุนูู ุงูู Entity Framework Core ุฅูู ูู ุงููู ูุจูู ุฃู ูุนุฏู ุงูู Database ุจูุงุกู ุนูู ุงูู Classes ุฏู.
ุงูู Models (ุฃู ุงูู Entities)
ูุจู ุฃู ุญุงุฌุฉ ูู ุงูู Code-Firstุ ูุงุฒู ูุฌูุฒ ุงูู Models ุจุชุงุนุชูุง. ุฏู ูู ุงูู Classes ุงููู ุจุชู ุซู ุงูุฏุงุชุง ุงูุฃุณุงุณูุฉ ุงููู ุงูุฃุจูููุดู ุจูุชุนุงู ู ู ุนุงูุง.
- ุชูุธูู
ุงูุดุบู: ุนุดุงู ุงูููุฏ ูุจูู ู
ูุธู
ุ ุจูุนู
ู folder ู
ุฎุตูุต ูู ุงูู project ููุญุท ุฌูุงู ุงูู Classes ุฏู. ู
ู
ูู ูุณู
ู ุงูู folder ุฏู
Models
ุฃูEntities
ุฃูDomain
. - ุงูุฃุณู
ุงุก ุงูู
ุฎุชููุฉ: ุงูู Classes ุฏู ูููุง ูุฐุง ุงุณู
ู
ู
ูู ุชุณู
ุนูู
:
- ุงูู Entities: ูุฃููุง ุจุชู ุซู ุงูููุงูุงุช ุฃู ุงูุฃุดูุงุก ุงูุฃุณุงุณูุฉ ูู ุงูุณูุณุชู ุจุชุงุนู (ุฒู ู ูุธูุ ู ูุชุฌุ ูุณู ุ ูุงุชูุฑุฉ).
- ุงูู POCO Class: ูุฏู ุงุชููู ูุง ุนููุง ุจุงูุชูุตููุ ููู ุงุฎุชุตุงุฑ ูู โPlain Old CLR Objectโ. ุงูููุฑุฉ ุฅููุง ุจุชุจูู Classes ุจุณูุทุฉ ุฌุฏูุงุ ุจุชุฑูุฒ ุนูู ุฅููุง ุชุดูู data ูู ุงูู properties ุจุชุงุนุชูุงุ ูู ูููุงุด logic ูุชูุฑ ุฃู ุงุนุชู ุงุฏูุฉ ุนูู framework ู ุนูู.
- ุงูู Domain Models: ูุฃููุง ุจุชู ุซู ุงูู ูุงููู ุงูุฃุณุงุณูุฉ ูู ู ุฌุงู ุงูุดุบู (ุงูู Domain) ุจุชุงุน ุงูุฃุจูููุดู.
ู
ุซุงู ุนู
ูู: ุงูู Employee
Class
ุชุนุงูู ูุนู
ู Class ุจุณูุท ูู
ุซุงูุ ูููุณู
ูู Employee
(ู
ูุธู):
// File: Models/Employee.cs
internal class Employee
{
// Property for Employee ID
public int Id { get; set; }
// Property for Employee Name
public string Name { get; set; }
// Property for Employee Salary
public double Salary { get; set; }
// Property for Employee Age (Nullable)
public int? Age { get; set; }
}
- ุฒู ู
ุง ุฅูุช ุดุงููุ ุงูู
Class
ุฏู ู ุซุงู ูููุณ ุฌุฏูุง ุนูู ุงูู POCO Class. ู ุฌุฑุฏ properties ุจุณูุทุฉ ุจุชุณุชุฎุฏู ุงูู auto-implemented properties ({get; set;}
) ุนุดุงู ุชุดูู ุงูุฏุงุชุง.
ุงูู Mapping (ุงูุชุญููู ู ู ููุฏ ูุฏุงุชุงุจูุฒ)
ุฏูููุชู ุฅุญูุง ุนู
ููุง ุงูู Employee
Class. ุงูุณุคุงู ุงูู
ูู
: ุฅุฒุงู ุงูู EF Core ููุนุฑู ูุญูู ุงูู Class ุฏู ูุญุงุฌุฉ ูููู
ูุง ุฌูู ุงูู Databaseุ (ุฒู ุฅูู ูุนู
ู Table ุจุงูู Columns ุงูู
ูุงุณุจุฉ). ุงูุนู
ููุฉ ุฏู ุจูุณู
ููุง Mapping.
ุงูู EF Core ุจูุฏููุง ูุฐุง ุทุฑููุฉ ูุนู ู ุจููุง ุงูู Mapping ุฏู. ููู ุฃุฑุจุน ุทุฑู ุฃุณุงุณูุฉุ ูุงูู ูู ูุนุฑู ุฅู ุงูุทุฑู ุฏู ุจุชูู ู ุจุนุถูุง. ูุนูู ุฅููุ ูุนูู ุงูู EF Core ุจูุจุฏุฃ ุจุงูุทุฑููุฉ ุงูุฃุณูู ูุงูุฃูุซุฑ ุดููุนูุง (ุฑูู 1)ุ ููู ุฅูุช ู ุญุชุงุฌ ุชุชุญูู ุฃูุชุฑ ุฃู ุชุบูุฑ ุญุงุฌุฉ ูู ุงูุณููู ุงูุงูุชุฑุงุถู ุฏูุ ุจุชุจุฏุฃ ุชุณุชุฎุฏู ุงูุทุฑู ุงููู ุจุนุฏูุง (2ุ 3ุ 4) ุนุดุงู ุชุนู ู ุชุฎุตูุต ุฒูุงุฏุฉ.
1. By Convention (Default)
ููู ุฉ Convention ููุง ู ุนูุงูุง โุงูุนูุฑูโ ุฃู โุงูุงุชูุงู ุงูุถู ููโ ุฃู โุงูุณููู ุงูุงูุชุฑุงุถูโ.
- ุงูููุฑุฉ ุงูุฃุณุงุณูุฉ: ุฏู ุงูุทุฑููุฉ ุงููู ุงูู EF Core ุจูุดุชุบู ุจููุง ููุญุฏู ู ู ุบูุฑ ู ุง ุฅูุช ุชูุชุจ ุฃู ููุฏ ู ุฎุตูุต ููู Mapping. ูู ุนูุฏู ู ุฌู ูุนุฉ ููุงุนุฏ (ุฒู ุงุชูุงู ุจููู ูุจููู) ุจูู ุดู ุนูููุง ุนุดุงู ูููู ุงูู Classes ุจุชุงุนุชู ููุญูููุง ูู Database Schema ูู ุงูุฏุงุชุงุจูุฒ.
- ู
ูู ุงููู ุจูุญุฏุฏูุงุ ุงูู Conventions ุฏู ุฌุงูุฉ ู
ุน ุงูู EF Core ููุณู. ุฅูุช ูู developer ู
ุฌุฑุฏ ุจุชูุชุจ ุงูููุฏ ุจุชุงุนู ุจุทุฑููุฉ ููุงุณูุฉ (ุฒู ุชุณู
ูุฉ ุงูู Primary Key ุจู
Id
)ุ ููู ุจูููู ูุตุฏู. - ุงูู ุฌููุฏ ุงูู ุทููุจ: ุชูุฑูุจูุง ู ููุด! ุฏู ุงูุทุฑููุฉ ุงูุทุจูุนูุฉ ูุงูุงูุชุฑุงุถูุฉุ ู ุด ู ุญุชุงุฌ ุชุนู ู ุฃู ุญุงุฌุฉ ุฒูุงุฏุฉ ูู ุฃุบูุจ ุงูุญุงูุงุช ุงูุจุณูุทุฉ.
ุฃู ุซูุฉ ุนูู ุงูู Conventions ุงูู ุดููุฑุฉ:
- ุชุญุฏูุฏ ุงูู Primary Key (ุงูู
ูุชุงุญ ุงูุฃุณุงุณู):
- ูู ุนูุฏู property ูู ุงูู Class ุงุณู
ูุง
Id
(ุฒู ูู ู ุซุงููุง). - ุฃู ูู ุงุณู
ูุง ููุณ ุงุณู
ุงูู Class +
Id
(ูุนูู ูู ุงูููุงุณ ุงุณู ูEmployee
ุ ูุงูู property ุงุณู ูุงEmployeeId
). - ูู ุงูุญุงูุชูู ุฏููุ ุงูู EF Core ููุญุฏู (By Convention) ูููุชุฑุถ ุฅู ุงูู property ุฏู ูู ุงูู Primary Key ุจุชุงุน ุงูู Table ุงููู ููุชุนู ู.
- ููู ุงู: ูู ุฃุบูุจ ุฃููุงุน ุงูุฏุงุชุงุจูุฒ (ุฒู SQL Server)ุ ููุฎูู ุงูู Primary Key ุฏู ู ู ุงูููุน Identityุ ูุนูู ููู ุชู ูุชุฒูุฏ ุชููุงุฆููุง ู ุน ูู record ุฌุฏูุฏ (Auto-increment).
- ูู ุนูุฏู property ูู ุงูู Class ุงุณู
ูุง
- ุชุญููู ุฃููุงุน ุงูุจูุงูุงุช (Data Types):
- ุงูู
string
ูู C# ุจุชุชุญูู ููnvarchar(max)
ูู SQL Server (ูุนูู string ููุฏุฑ ูุดูู ุนุฏุฏ ุญุฑูู ูุจูุฑ ุฌุฏูุง ูู ู ูู ูุฎุฒู ุญุฑูู Unicode). - ุงูู
int
ุจุชุชุญูู ููint
. - ุงูู
double
ุจุชุชุญูู ููfloat
. - ุงูู
decimal
ุจุชุชุญูู ููdecimal(18, 2)
(ุฏูุฉ ููุงุณูุฉ). - ุงูู
DateTime
ุจุชุชุญูู ููdatetime2
. - ูููุฐุงโฆ ููู ููุน ุฏุงุชุง ูู C# ููู ู ูุงุจู ุงูุชุฑุงุถู ูู ุงูุฏุงุชุงุจูุฒ.
- ุงูู
- ุชุญุฏูุฏ ุงูู Nullability (ูู ุงูููู
ุฉ ู
ู
ูู ุชุจูู ูุงุถูุฉุ):
- ุฏู ููุทุฉ ู ูู ุฉ ูุจุชุนุชู ุฏ ุนูู ุฅุฐุง ููุช ู ุณุชุฎุฏู Nullable Reference Types ู Nullable Value Types ูู C# ููุง ูุฃ (ุฒู ู ุง ุงุชููู ูุง ูู Nullable Types).
- ุงููุงุนุฏุฉ:
- ูู ุงูู property ูู C# ู
ุด nullable (ุฒู
string Name
ุฃูdouble Salary
ูู ู ุซุงููุง ุงูุฃูู)ุ ูุจูู ุงูู Column ุงููู ููุชุนู ู ูู ุงูุฏุงุชุงุจูุฒ ููุจูู NOT NULL (ุฅุฌุจุงุฑู ูุงุฒู ุชุฏุฎูู ููู ุฉ). - ูู ุงูู property ู
ุนู
ููุฉ nullable ูู C# (ุจุงุณุชุฎุฏุงู
ุนูุงู
ุฉ ุงูุงุณุชููุงู
?
ููู value types ุฒูint? Age
ุ ุฃู ูู ู ูุนู ุงูู Nullable Reference Types ูุงุณุชุฎุฏู ุชstring?
ู ุซููุง)ุ ูุจูู ุงูู Column ุงูู ูุงุจู ูู ุงูุฏุงุชุงุจูุฒ ููุณู ุญ ุจููู NULL (ูุนูู ุงูููู ุฉ ุงุฎุชูุงุฑูุฉ Optional).
- ูู ุงูู property ูู C# ู
ุด nullable (ุฒู
ุชุทุจูู ุงูู Conventions ุนูู ุงูู Employee
Class ุจุชุงุนูุง:
ูู ุทุจููุง ุงูููุงุนุฏ ุฏู ุนูู ุงูู Employee
class ุงูุฃุตูู ุงููู ุนู
ููุงู:
- ุงูู
Id
(int):- ุนุดุงู ุงุณู
ูุง
Id
ุ ูุชุจูู ูู ุงูู Primary Key. - ูุชุจูู Identity (auto-increment).
- ููุน ุงูู Column ููุจูู
int
ู ููุจูู NOT NULL.
- ุนุดุงู ุงุณู
ูุง
- ุงูู
Name
(string):- ูุชุจูู Column ููุนู
nvarchar(max)
. - ูุชุจูู NOT NULL (ูู ู
ุด ู
ูุนู Nullable Reference Typesุ ุฃู ูู ู
ูุนููุง ูู
ูุชุจุชูุงุด
string?
).
- ูุชุจูู Column ููุนู
- ุงูู
Salary
(double):- ูุชุจูู Column ููุนู
float
. - ูุชุจูู NOT NULL (ูุฃู
double
ุงูุนุงุฏูุฉ ู ุด nullable).
- ูุชุจูู Column ููุนู
- ุงูู
Age
(int?):- ุนุดุงู ู
ุณุชุฎุฏู
ูู
int?
(ูุนูู nullable value type)ุ ุงูู Column ููุจูู ููุนูint
. - ูููุณู
ุญ ุจููู
NULL
(ูุนูู Optional).
- ุนุดุงู ู
ุณุชุฎุฏู
ูู
ุฎุทูุฉ ู ูู ุฉ: ุฅุฒุงู ุงูู Class ุจูุชุญูู ูู Table ูุนููุงุ (ุฏูุฑ ุงูู DbContext)
ุงูููุงู ุงููุธุฑู ุฏู ุฌู ููุ ุจุณ ุงูู EF Core ู ุด ููุฑูุญ ูุฏูุฑ ุนูู ูู ุงูู Classes ูู ุงูู project ุจุชุงุนู ููุญูููุง ูู tables ูุฏู ูุฎูุงุต. ูุงุฒู ุชูููู ุตุฑุงุญุฉู ุฅูู ูู ุงูู Classes (ุงูู Entities) ุงููู ุฅูุช ุนุงูุฒู ูุชุนุงู ู ู ุนุงูุง ูุฌุฒุก ู ู ุงูู Database Model ุจุชุงุนู.
- ุงูุญู: ุจูุนู
ู ุฏู ุนู ุทุฑูู ุฅููุง ุจูุถูู property ู
ู ููุน
DbSet<T>
ุฌูู ุงูููุงุณ ุงูุฃุณุงุณู ุงููู ุจูู ุซู ุงูุฏุงุชุงุจูุฒ ุจุชุงุนุชูุง ูู ุงูููุฏ. - ุงูู Understanding DbContext in Entity Framework Core: ุงูููุงุณ ุฏู ุงููู ุจูุญุชูู ุนูู ุงูู
DbSet
properties ูู ุงููู ุจูุณู ููDbContext
. ุฏู ูุนุชุจุฑ ูู โู ุฏูุฑ ุงูุฏุงุชุงุจูุฒโ ุจุชุงุนู ูู ุงูููุฏุ ูู ุงููุณูุท ุงููู ุจูู ุงูููุฏ ุจุชุงุนู ูุจูู ุงูุฏุงุชุงุจูุฒ ุงููุนููุฉ.
ูุนููุ ุนุดุงู ุงูู Employee
class ูุชููู
ููุชุญูู ูู tableุ ูุงุฒู
ูุถูู ุงูุณุทุฑ ุฏู ุฌูู ุงูู DbContext
ุจุชุงุนูุง:
// Inside your DbContext class (e.g., CompanyDbContext)
public DbSet<Employee> Employees { get; set; }
// Comment: We will talk to the 'Employees' table (or view/function)
// in the database through this 'Employees' property.
// Example usage later in code:
// var firstEmployee = dbContext.Employees.FirstOrDefault(E => E.Id == 1);
- ูู
ุง ุจูุถูู ุงูู
DbSet<Employee>
ุฏูุ ุงูู EF Core ููุช ู ุง ุจูุนู ู build ููู model ุจุชุงุนูุ ุจูุดูู ุงูู property ุฏู ูุจูููู ุฅูู ู ุทููุจ ู ูู ูุนู ู mapping ูููEmployee
class. ูุณุงุนุชูุง ุจูุฑูุญ ูุทุจู ููุงุนุฏ ุงูู Convention (ุฃู ุฃู ุทุฑููุฉ mapping ุชุงููุฉ ุฅูุช ู ุญุฏุฏูุง) ุนุดุงู ูุนุฑู ุดูู ุงูู Table ุฏู ุงูู ูุฑูุถ ูุจูู ุฅูู. - ููู ุงุณู
ูุง
DbSet
ุ ุงูุงุณู ุฏู ู ุฑู ุดููุฉุ ูุฃู ุงููDbSet
ู ุด ุดุฑุท ูู ุซู Table ุจุณุ ู ู ูู ูู ุณููุงุฑูููุงุช ู ุชูุฏู ุฉ ูุฎููู ูุนู ู map ูู View ูู ุงูุฏุงุชุงุจูุฒ ุฃู ุญุชู ูุณุชุฎุฏู Table-Valued Function (TVF) ูู ุตุฏุฑ ููุฏุงุชุง. ุจุณ ูู ุงูุฃุบูุจ ุจูุณุชุฎุฏู ู ุนุดุงู ูู ุซู Tables.
ุงูุฎูุงุตุฉ: ุทุฑููุฉ ุงูู Convention ูู ุงูุฃุณุงุณ ูุงูุจุฏุงูุฉ. ุจุชูุชุจ ุงูู POCO classes ุจุชุงุนุชู ุจุดูู ููุงุณูุ ูุชุถูู ููุง DbSet
ูู ุงูู DbContext
ุ ูุงูู EF Core ุจูููู
ุจุงูุจุงูู ุจุดูู ุงูุชุฑุงุถู.
ุทูุจ ูู ุงูุงูุชุฑุงุถุงุช ุฏู ู
ุด ู
ูุงุณุจุฉุ ูู ุนุงูุฒ ุงุณู
ุงูู Table ูุจูู ู
ุฎุชููุ ูู ุนุงูุฒ ุงุณู
Column ูุจูู ู
ุฎุชููุ ูู ุนุงูุฒ ููุน ุฏุงุชุง ู
ุนูู ูู ุงูุฏุงุชุงุจูุฒ ู
ุด ูู ุงูุงูุชุฑุงุถูุ ูู ุนุงูุฒ Primary Key ูุจูู ู
ุด Id
ุ ููุง ุจูุญุชุงุฌ ููุชูู ููุทุฑููุฉ ุงูุชุงููุฉ.
2. Data Annotation
ุฏู ุงูุทุฑููุฉ ุงูุชุงููุฉ ุนุดุงู ูุฎุตุต ุงูู mapping ุงููู ุจูุญุตู By Convention.
-
ุงูููุฑุฉ: ุจูุณุชุฎุฏู ุญุงุฌุฉ ุงุณู ูุง Attributes ูู C#. ุงูู Attribute ุฏู ุจูุจูู ุฒู โุนูุงู ุฉโ ุฃู โุชุงุฌโ ุจูุญุทู ููู ุงูู Class ููุณู ุฃู ููู ุงูู Properties ุจุชุงุนุชู ุนุดุงู ูุฏู ุชุนููู ุงุช ุฒูุงุฏุฉ ููู EF Core.
-
ููุง ุงุณุชุฎุฏู ูุง Attribute ูู ูุงูุฑ ูู Bit Flags with Enum
-
ุฏุง ุจููุชุญููุง ููุงู ูุชูุฑ ูู ุงูู Reflection
-
ุงูุงุณุชุฎุฏุงู ุงูุฃุณุงุณู:
- ุชุฎุตูุต ุงูู Mapping: ูููู ููู EF Core ูุนู ู ุญุงุฌุงุช ุบูุฑ ุงููู ูุงู ููุนู ููุง By Convention (ุฒู ุชุบููุฑ ุงุณู Table ุฃู Columnุ ุชุญุฏูุฏ ููุน ุฏุงุชุง ู ุนููุ ุชุญุฏูุฏ ุงูู Primary Key ุตุฑุงุญุฉูุ ุฅูุฎ).
- ุนู ู Data Validation: ูุชูุฑ ู ู ุงูู Data Annotations ุฏู ูููุง ุฏูุฑ ู ุฒุฏูุฌุ ู ุด ุจุณ ุจุชุฃุซุฑ ุนูู ุงูุฏุงุชุงุจูุฒุ ุฏู ูู ุงู ุจุชุณุชุฎุฏู ุนุดุงู ูุญุท ููุงุนุฏ ููุชุญูู ู ู ุตุญุฉ ุงูุจูุงูุงุช (Validation Rules) ุงููู ุงูููุฒุฑ ุจูุฏุฎููุง.
-
ุฒู ู ุง ููููุงุ ุงูุทุฑู ุจุชูู ู ุจุนุถ: ุจูุจุฏุฃ ุจุงูู Conventionุ ููู ููู ุญุงุฌุฉ ู ุญุชุงุฌุฉ ุชุชุบูุฑุ ุจูุณุชุฎุฏู Data Annotation ุนุดุงู ูุบูุฑูุง.
ู
ุซุงู: ุชุนุฏูู ุงูู Employee
Class ุจุงุณุชุฎุฏุงู
Data Annotations
ูููุชุฑุถ ุฅููุง ุนุงูุฒูู ูุนู
ู ุงูุชุนุฏููุงุช ุฏู ุนูู ุงูู Employee
class:
- ูุบูุฑ ุงุณู
ุงูู Primary Key property ู
ู
Id
ููEmpId
. - ูุฎูู ุงูู
Name
ู ุทููุจ (Required
) ูุฃูุตู ุทูู ููู 100 ุญุฑู ุจุณ (ุจุฏูnvarchar(max)
). - ูุฎูู ููุน ุงูู
Salary
ูู ุงูุฏุงุชุงุจูุฒ ูุจููdecimal(18, 2)
ุนุดุงู ุงูุฏูุฉ (ุจุฏูfloat
). - ูุถูู ูุงุนุฏุฉ validation ุฅู ุงูู
Age
ูุงุฒู ูููู ุจูู 18 ู 65. - ูุถูู property ุฒูุงุฏุฉ ูู ุงูููุงุณ ุงุณู
ูุง
FullInfo
ุจุชุนุฑุถ ุงูุงุณู ูุงูุนู ุฑ ู ุน ุจุนุถุ ุจุณ ู ุด ุนุงูุฒูููุง ุชุชุฎุฒู ูู ุงูุฏุงุชุงุจูุฒ.
ุงูููุงุณ ููุจูู ุดููู ูุฏู (ููุญุชุงุฌ ูุนู
ู using
ูู namespaces ู
ุนููุฉ):
// Need: using System.ComponentModel.DataAnnotations;
// Need: using System.ComponentModel.DataAnnotations.Schema;
// Example: Let's map this class to a table named "EmployeesInfo" in the "hr" schema
[Table("EmployeesInfo", Schema = "hr")]
internal class Employee
{
// [Key] explicitly defines the Primary Key
[Key]
// [DatabaseGenerated(Identity)] specifies auto-increment behavior
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int EmpId { get; set; } // Name changed, convention won't find PK anymore
// [Required] makes the DB column NOT NULL and adds validation
[Required(ErrorMessage = "Employee name is mandatory.")]
// [MaxLength] limits DB column size and adds validation
[MaxLength(100)]
public string Name { get; set; }
// [Column] allows specifying exact DB TypeName
[Column(TypeName = "decimal(18, 2)")]
public double Salary { get; set; } // Still double in C#, but maps to decimal in DB
// [Range] primarily for validation, doesn't usually affect DB schema directly
[Range(18, 65, ErrorMessage = "Age must be between 18 and 65.")]
public int? Age { get; set; }
// [NotMapped] tells EF Core to completely ignore this property for DB mapping
[NotMapped]
public string FullInfo { get { return $"{Name} ({(Age.HasValue ? Age.Value.ToString() : "N/A")})"; } }
// Example: Using DataType for hints (often for UI/Validation)
// [DataType(DataType.Currency)] // Hint for UI
// public decimal Bonus { get; set; } // Let's assume we added a Bonus property
// Example: Using EmailAddress validation shortcut
// [EmailAddress]
// public string WorkEmail { get; set; }
}
ุดุฑุญ ุงูู Attributes (ุงูุนูุงู ุงุช) ุงููู ุงุณุชุฎุฏู ูุงูุง:
- ุงูู
[Key]
:- ุงููุธููุฉ: ุจุชููู ููู EF Core ุตุฑุงุญุฉู: โุงูู property ุฏู ูู ุงูู Primary Keyโ. ุงุณุชุฎุฏู
ูุงูุง ููุง ูุฃููุง ุบูุฑูุง ุงูุงุณู
ู
ู
Id
ููEmpId
ุ ูุงูู Convention ู ุจูุชุด ุนุงุฑูุฉ ุชุญุฏุฏ ุงูู PK ููุญุฏูุง. - ุงูู ูุงู: ููู ุงูู property ุงููู ุนุงูุฒูุง ุชุจูู PK.
- ุงูู Namespace:
System.ComponentModel.DataAnnotations
.
- ุงููุธููุฉ: ุจุชููู ููู EF Core ุตุฑุงุญุฉู: โุงูู property ุฏู ูู ุงูู Primary Keyโ. ุงุณุชุฎุฏู
ูุงูุง ููุง ูุฃููุง ุบูุฑูุง ุงูุงุณู
ู
ู
- ุงูู
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
:- ุงููุธููุฉ: ุจุชููู ููู EF Core ุฅุฒุงู ููู ุฉ ุงูู property ุฏู ุจุชุชุฌุงุจ.
- ุงูู
DatabaseGeneratedOption.Identity
: ู ุนูุงูุง ุฅู ุงูุฏุงุชุงุจูุฒ ูู ุงููู ู ุณุฆููุฉ ุนู ุชูููุฏ ุงูููู ุฉ ุฏูุ ูุบุงูุจูุง ุจุชููู ุนู ุทุฑูู auto-increment (ุฒูุงุฏุฉ ุชููุงุฆูุฉ). - ุฎูุงุฑุงุช ุชุงููุฉ:
- ุงูู
None
: ู ุนูุงูุง ุฅู ุงูุฏุงุชุงุจูุฒ ู ููุงุด ุฏุนูุฉ ุจุชูููุฏ ุงูููู ุฉุ ูุฅูุช ุงููู ูุชุฏุฎููุง ู ู ุงูููุฏ ุจุชุงุนู (ู ุซููุง ูู ุงูู PK ู ุด ุฑูู ุจูุฒูุฏ ููุญุฏูุ ุฒู GUID ุฃู ุฑูู ููู ู). ู ู ูู ุชุณุชุฎุฏู ุฏู ูู ุงูู Convention ูุงูุช ูุชุฎูููุง Identity ูุฅูุช ู ุด ุนุงูุฒ ูุฏู. - ุงูู
Computed
: ู ุนูุงูุง ุฅู ุงูููู ุฉ ุฏู ุจุชุชุญุณุจ ุฌูู ุงูุฏุงุชุงุจูุฒ ููุณูุงุ ุจูุงุกู ุนูู columns ุชุงููุฉ (ุฒู Computed Column ูู SQL Server). ู ุซุงู ุจุณูุท: ูู ุนูุฏูFirstName
ูLastName
ูุนุงูุฒ ุชุนู ู column ุงุณู ูFullName
ุจูุชุญุณุจ ุชููุงุฆู ูู ุงูุฏุงุชุงุจูุฒ. (ู ูุญูุธุฉ: ุชุญุฏูุฏ ุงูู formula ููุณูุง ุบุงูุจูุง ุจูุญุชุงุฌ ุงูุทุฑููุฉ ุงูุชุงูุชุฉ ููู Mapping ุงููู ูู Fluent API).
- ุงูู
- ุงูู
[Required]
:- ุงููุธููุฉ: ูููุง ุฏูุฑูู:
- ุงูู Schema: ุจุชุฎูู ุงูู Column ูู ุงูุฏุงุชุงุจูุฒ ูุจูู
NOT NULL
. - ุงูู Validation: ุจุชุณุชุฎุฏู
ูู ุงูู frameworks ุฒู ASP.NET Core ุนุดุงู ุชุชุฃูุฏ ุฅู ุงูููุฒุฑ ุฏุฎู ููู
ุฉ ููู field ุฏู ูู
ุชุณุงุจูุด ูุงุถู. ู
ู
ูู ุชุญุท
ErrorMessage
ุนุดุงู ุชุธูุฑ ุฑุณุงูุฉ ู ุนููุฉ ููููุฒุฑ.
- ุงูู Schema: ุจุชุฎูู ุงูู Column ูู ุงูุฏุงุชุงุจูุฒ ูุจูู
- ุงููุธููุฉ: ูููุง ุฏูุฑูู:
- ุงูู
[MaxLength(100)]
:- ุงููุธููุฉ: ูููุง ุฏูุฑูู:
- ุงูู Schema: ุจุชุญุฏุฏ ุฃูุตู ุนุฏุฏ ุญุฑูู ููู column ูู ุงูุฏุงุชุงุจูุฒ (ู
ุซููุง ูุชุนู
ููุง
nvarchar(100)
ุจุฏูnvarchar(max)
ุงูุงูุชุฑุงุถู). - ุงูู Validation: ุจุชุณุชุฎุฏู ุนุดุงู ุชุชุฃูุฏ ุฅู ุงูููุฒุฑ ู ุฏุฎูุด ุญุฑูู ุฃูุชุฑ ู ู ุงูู ุณู ูุญ.
- ุงูู Schema: ุจุชุญุฏุฏ ุฃูุตู ุนุฏุฏ ุญุฑูู ููู column ูู ุงูุฏุงุชุงุจูุฒ (ู
ุซููุง ูุชุนู
ููุง
- ุงููุธููุฉ: ูููุง ุฏูุฑูู:
- ุงูู
[StringLength(max, MinimumLength = min)]
:- ุงููุธููุฉ: ุฒู
MaxLength
ุจุณ ู ู ูู ุชุญุฏุฏ ูู ุงู ุฃูู ุนุฏุฏ ุญุฑูู ู ุณู ูุญ ุจูู (MinimumLength
). ุฏู ุจุชุณุชุฎุฏู ุฃูุชุฑ ููู Validation.
- ุงููุธููุฉ: ุฒู
- ุงูู
[Column(TypeName = "decimal(18, 2)")]
:- ุงููุธููุฉ: ุจุชุณู
ุญูู ุชุญุฏุฏ ููุน ุงูุฏุงุชุง ุจุชุงุน ุงูู Column ูู ุงูุฏุงุชุงุจูุฒ ุจุงูุธุจุท ุฒู ู
ุง ุฅูุช ุนุงูุฒู (ู
ุซููุง
decimal(18, 2)
ุฃูvarchar(50)
ุฃูdate
).
- ุงููุธููุฉ: ุจุชุณู
ุญูู ุชุญุฏุฏ ููุน ุงูุฏุงุชุง ุจุชุงุน ุงูู Column ูู ุงูุฏุงุชุงุจูุฒ ุจุงูุธุจุท ุฒู ู
ุง ุฅูุช ุนุงูุฒู (ู
ุซููุง
- ุงูู
[Range(18, 65)]
:- ุงููุธููุฉ: ุฏู ุฃุณุงุณูุง ููู Validation. ุจุชุญุฏุฏ ุฅู ุงูููู
ุฉ ุงูุฑูู
ูุฉ (ุฃู ุงูุชุงุฑูุฎ) ูุงุฒู
ุชููู ูู ูุทุงู ู
ุนูู. ู
ุด ุจุชุบูุฑ ุงูู Schema ุจุชุงุน ุงูุฏุงุชุงุจูุฒ ูู ุงูุนุงุฏู. ู
ู
ูู ุชุญุท
ErrorMessage
.
- ุงููุธููุฉ: ุฏู ุฃุณุงุณูุง ููู Validation. ุจุชุญุฏุฏ ุฅู ุงูููู
ุฉ ุงูุฑูู
ูุฉ (ุฃู ุงูุชุงุฑูุฎ) ูุงุฒู
ุชููู ูู ูุทุงู ู
ุนูู. ู
ุด ุจุชุบูุฑ ุงูู Schema ุจุชุงุน ุงูุฏุงุชุงุจูุฒ ูู ุงูุนุงุฏู. ู
ู
ูู ุชุญุท
- ุงูู
[DataType(DataType...)]
:- ุงููุธููุฉ: ุจุชุฏู ู
ุนููู
ุฉ ุฅุถุงููุฉ ุนู ุทุจูุนุฉ ุงูุฏุงุชุง (ุฒู
DataType.Currency
,DataType.EmailAddress
,DataType.Password
,DataType.Date
). ุฏู ุจุชุณุชุฎุฏู ุฃูุชุฑ ููู Validation ูุนุดุงู ุงูู UI frameworks ุชุนุฑู ุชุนุฑุถ input field ู ูุงุณุจ (ู ุซููุง ุชุนุฑุถ ุฑู ุฒ ุงูุนู ูุฉุ ุฃู ุชุฎูู ุงูู input ุจุชุงุน ุงูุจุงุณูุฑุฏ ูุฌูู ). ูู ุงูุบุงูุจ ู ุด ุจุชุบูุฑ ููุน ุงูู column ูู ุงูุฏุงุชุงุจูุฒ ููุญุฏูุงุ ูู ุนุงูุฒ ุชุบูุฑ ููุน ุงูุฏุงุชุงุจูุฒ ุงุณุชุฎุฏู[Column(TypeName = "...")]
ู ุนุงูุง.
- ุงููุธููุฉ: ุจุชุฏู ู
ุนููู
ุฉ ุฅุถุงููุฉ ุนู ุทุจูุนุฉ ุงูุฏุงุชุง (ุฒู
- ุงูู
[EmailAddress]
,[Phone]
,[CreditCard]
:- ุงููุธููุฉ: ุฏู ุงุฎุชุตุงุฑุงุช ูู
[DataType]
ูุจุชุถูู validation ุฌุงูุฒุฉ ุนุดุงู ุชุชุฃูุฏ ุฅู ุงูููุฑู ุงุช ุจุชุงุนุช ุงูุฅูู ูู ุฃู ุงูุชููููู ุฃู ุงููุฑูุฏุช ูุงุฑุฏ ุตุญ.
- ุงููุธููุฉ: ุฏู ุงุฎุชุตุงุฑุงุช ูู
- ุงูู
[NotMapped]
:- ุงููุธููุฉ: ู ูู ุฉ ุฌุฏูุง. ุจุชููู ููู EF Core: โุงูู property ุฏู ุชุฌุงูููุง ุฎุงูุตุ ู ุชุนู ููุงุด map ูุฃู column ูู ุงูุฏุงุชุงุจูุฒโ. ุจูุณุชุฎุฏู ูุง ููู helper properties ุงููู ุจูุญุณุจูุง ูู ุงูููุฏ ุจุณ ูู ุด ุนุงูุฒูู ูุฎุฒููุง.
- ุงูู
[Table("EmployeesInfo", Schema = "hr")]
:- ุงููุธููุฉ:
- ุจุชุฎููู ุชุบูุฑ ุงุณู
ุงูู Table ูู ุงูุฏุงุชุงุจูุฒ (ููุง ููุจูู
EmployeesInfo
ุจุฏู ุงูุงุณู ุงูุงูุชุฑุงุถู ุงููู ู ู ูู ููููEmployee
ุฃูEmployees
). - ุจุชุฎููู ุชุญุฏุฏ ุงูู Schema ุงููู ุงูู Table ุฏู ููุชุญุท ุฌูุงู (ููุง
hr
ุจุฏู ุงูู schema ุงูุงูุชุฑุงุถู ุงููู ูู ุบุงูุจูุงdbo
). ุฏู ู ูุฒุฉ ู ูู ุฉ ู ุด ุจููุฏุฑ ูุนู ููุง ุจุณูููุฉ ุจุงูู Convention.
- ุจุชุฎููู ุชุบูุฑ ุงุณู
ุงูู Table ูู ุงูุฏุงุชุงุจูุฒ (ููุง ููุจูู
- ุงูู ูุงู: ููู ุงูู Class ููุณู.
- ุงููุธููุฉ:
ูู [Table]
ูุบูู ุนู DbSet
ุ
ุณุคุงู ูููุณ: ูู ุฃูุง ุงุณุชุฎุฏู
ุช ุงูู [Table]
attribute ุนุดุงู ุฃุญุฏุฏ ุงุณู
ุงูู Table ูุงูู Schemaุ ูู ุฏู ู
ุนูุงู ุฅูู ู
ุด ู
ุญุชุงุฌ ุฃูุชุจ DbSet<Employee>
ุฌูู ุงูู DbContext
ุ
- ุงูุฅุฌุงุจุฉ ู
ู ูุงุญูุฉ ุชูููุฉ: ูุงุ ู
ุด ู
ู
ูู. ุงูู
DbSet
ุถุฑูุฑู ุนุดุงู ุงูู EF Core ูุนุฑู ุฅู ุงูู Class ุฏู ุฌุฒุก ู ู ุงูู Model ุงููู ุนุงูุฒ ูุฏูุฑู ููุชุนุงู ู ู ุนุงู. ุงูู[Table]
attribute ุจูุณุชุฎุฏู ููุท ุนุดุงู ูุนู ู override ููู convention ุงูุฎุงุตุฉ ุจุงุณู ุงูู table ูุงูู schemaุ ููู ู ุด ุจูุบูู ุนู ุชุนุฑูู ุงูู Entity ูููDbContext
ุนู ุทุฑููDbSet
. ูุงุฒู ุชุนู ูDbSet
ุฏุงูู ูุง.
ุฃูู ูุฉ ุงูู Data Annotations ูู ุงูู Validation
ุฒู ู ุง ุดูููุงุ ูุชูุฑ ู ู ุงูู Annotations ุฏู ูููุง ุฏูุฑ ุญููู ูู ุนู ููุฉ ุงูู Validation (ุงูุชุญูู ู ู ุตุญุฉ ุงูุจูุงูุงุช).
- ุงูู Validation ููุนูู ุฃุณุงุณููู (Application Validation):
- ุงูู Front-end Validation (ูู ุงูู ุชุตูุญ): ุจุชุญุตู ุนูุฏ ุงูููุฒุฑ ูุจู ู ุง ูุจุนุช ุงูุฏุงุชุง ููุณูุฑูุฑ. ูุงูุฏุชูุง ุฅููุง ุณุฑูุนุฉุ ุจุชุฏู ููุฏุจุงู ููุฑู ููููุฒุฑ (ุฒู โู ูููุนุด ุชุณูุจ ุงูุฎุงูุฉ ุฏู ูุงุถูุฉโ)ุ ูุจุชููู ุงูุฑูููุณุชุงุช ุงูุบูุท ุงููู ุฑุงูุญุฉ ููุณูุฑูุฑ.
- ุงูู Back-end Validation (ุนูู ุงูุณูุฑูุฑ): ุจุชุญุตู ูู ุง ุงูุฏุงุชุง ุชูุตู ููุณูุฑูุฑ ุจุชุงุนู. ูุฏู ุงูุฃูู ูุงูุฃุณุงุณ ุงููู ู ูููุนุด ูุณุชุบูู ุนูู. ูููุ ูุฃู ุฃู ุญุฏ ู ู ูู ุจุณูููุฉ ูุชุฎุทู ุงูู front-end validation (ู ุซููุง ูููู ุงูู JavaScript ุฃู ูุณุชุฎุฏู ุฃุฏูุงุช ุฒู Postman). ุงูู Back-end validation ูู ุงูุถู ุงู ุงูุฃุฎูุฑ ุฅู ุงูุฏุงุชุง ุงููู ูุชุฏุฎู ุงูุฏุงุชุงุจูุฒ ุจุชุงุนุชู ุณููู ุฉ ูู ุทุงุจูุฉ ููููุงุนุฏ.
- ููู ุจูุนู ู ุงูุงุชูููุ ุจูุนู ู Front-end ุนุดุงู ูุญุณู ุชุฌุฑุจุฉ ุงูู ุณุชุฎุฏู (UX)ุ ูุจูุนู ู Back-end ุนุดุงู ุงูุฃู ุงู ูุชุฃููุฏ ุณูุงู ุฉ ุงูุจูุงูุงุช (Data Integrity).
- ููู ุฏูุฑ ุงูู Data Annotations ููุงุ ูู ุงูู frameworks ุงูุญุฏูุซุฉ ุฒู ASP.NET Core (MVC, Razor Pages, Blazor, API)ุ ุงูู Data Annotations ุงููู ุจูุญุทูุง ุนูู ุงูู Model classes ุจุชุงุนุชูุง (ุฒู
Employee
) ูููุง ูุงูุฏุฉ ู ุฒุฏูุฌุฉ ุฑุงุฆุนุฉ:- ุงูู Framework ุจููุฏุฑ ููุฑุฃ ุงูู Annotations ุฏู ููุณุชุฎุฏู ูุง ุนุดุงู ูุนู ู generate ูู validation scripts ุชุดุชุบู ูู ุงูู front-end (ุบุงูุจูุง JavaScript) ุชููุงุฆููุง.
- ููู ููุณ ุงูููุชุ ุงูู Framework ุจูุณุชุฎุฏู ููุณ ุงูู Annotations ุฏู ุนุดุงู ูุนู ู validation ููุฏุงุชุง ูู ุง ุชูุตู ููู back-end (ุนูู ุงูุณูุฑูุฑ)ุ ูุฏู ุจูุญุตู ุบุงูุจูุง ูุฌุฒุก ู ู ุนู ููุฉ ุงูู Model Binding ูุจู ู ุง ุงูุฏุงุชุง ุชูุตู ููู Action method ุจุชุงุนุชู.
- ูุนูู ุจุชูุชุจ ุงููุงุนุฏุฉ ู ุฑุฉ ูุงุญุฏุฉ ุจุงูู Annotationุ ููู ุจุชุณุชุฎุฏู ูู ุงููุงุญูุชูู.
- ูู ุฏู validation ุจุชุงุนุฉ MVCุ ุฃููุฉุ ุงูู Data Annotations ูู ุงูุทุฑููุฉ ุงูุฃุณุงุณูุฉ ูุงูุฑุณู ูุฉ ูุชุนุฑูู ููุงุนุฏ ุงูู validation ูู ASP.NET Core. ูุงูู validation ุงููู ุจูุญุตู ุนูู ุงูุณูุฑูุฑ ุจุงุณุชุฎุฏุงู ุงูู Annotations ุฏู ูุนุชุจุฑ ุฌุฒุก ุฃุณุงุณู ู ู ุงูู back-end validation.
- ุจุณ ู ุด ุตุญ ุงู ุฃุนู ู Validation ูููุฑููุช ุจุณ ูู ุงูู Domain Model ุงููู ุจูููู ุนููู POCO Class ูุฃู ุฏู ุงูู ูุฑูุถ ูููุง ุญุงุฌุงุช ุชุชุญูู ูู ุงูู Database ุฅูู ุง ุงูู ูุฑูุถ ูุจูุง ุฌูุง View Model.
ู ูุฎุต ูุฃุดูุฑ ุงูู Data Annotations (ุจุงุฎุชุตุงุฑ ูู ู ุบูุฑ ุญุดู)
Annotation | ุงูุบุฑุถ ุงูุฃุณุงุณู | ุงูุชุฃุซูุฑ ุงูุฃุณุงุณู |
---|---|---|
[Key] | ุชุญุฏูุฏ ุงูู Primary Key | Schema |
[Required] | ู ุทููุจ (NOT NULL ูู DBุ ูุฅุฌุจุงุฑู ูู ุงูุฅุฏุฎุงู) | Schema & Validation |
[MaxLength(n)] | ุฃูุตู ุทูู ููุญุฑูู | Schema & Validation |
[StringLength(max, Min=min)] | ุฃูุตู ูุฃูู ุทูู ููุญุฑูู | Validation |
[Range(min, max)] | ุชุญุฏูุฏ ู ุฏู ู ูุจูู ููุฃุฑูุงู /ุงูุชูุงุฑูุฎ | Validation |
[RegularExpression("...")] | ู ุทุงุจูุฉ ูู ุท ู ุนูู (regex) | Validation |
[EmailAddress] , [Phone] | ุงูุชุญูู ู ู ููุฑู ุงุช ุงูุฅูู ูู/ุงูุชููููู | Validation |
[Compare("OtherProp")] | ู ูุงุฑูุฉ ููู ุฉ ุจู property ุชุงููุฉ (ุฒู ุชุฃููุฏ ุงูุจุงุณูุฑุฏ) | Validation |
[DataType(DataType...)] | ุชุญุฏูุฏ ููุน ุงูุฏุงุชุง (hint ููู UI/Validation) | Validation |
[Timestamp] | ูุนู ู Row Versioning (ุชุชุจุน ุงูุชุนุฏููุงุช ููู Concurrency) | Schema |
[ConcurrencyCheck] | ุงุณุชุฎุฏุงู ุงูู column ุฏู ูู ุงูู Optimistic Concurrency Check | Schema |
[Column(TypeName="...", Order=n)] | ุชุญุฏูุฏ ููุน/ุชุฑุชูุจ ุงูู column ูู DB | Schema |
[Table("...", Schema="...")] | ุชุญุฏูุฏ ุงุณู ุงูู Table ูุงูู Schema | Schema |
[ForeignKey("NavProp")] | ุชุญุฏูุฏ ุงูู Foreign Key ุงูู ุฑุชุจุท ุจู Navigation Property | Schema (Relation) |
[InverseProperty("...")] | ุชุญุฏูุฏ ุงูู Navigation Property ุงูู ูุงุจู ูู ุงูุทุฑู ุงูุชุงูู ู ู ุงูุนูุงูุฉ (1-*) | Schema (Relation) |
[DatabaseGenerated(...)] | ุชุญุฏูุฏ ููู ุชุชููุฏ ุงูููู ุฉ (Identity, Computed, None) | Schema |
[NotMapped] | ุชุฌุงูู ุงูู property ุฏู ูู ุงูู Mapping | Schema |
ุฅูู ุงููู ููุญุตู ูู ุนู
ููุง Add-Migration
ุฏูููุชูุ
ุจุนุฏ ู
ุง ุนุฏููุง ุงูู Employee
class ูุถููุง ุงูู Data Annotations ุฏู ูููุง (ุบูุฑูุง ุงุณู
ุงูู PKุ ุญุฏุฏูุง ุงูุทูู ูุงูููุน ูู columns ุชุงููุฉุ ุชุฌุงูููุง propertyุ ุญุทููุง rules ููู validationุ ุบูุฑูุง ุงุณู
ุงูู Table ูุงูู Schema)ุ ูู ุฑุญูุง ุฏูููุชู ุนูู ุงูู Package Manager Console (PM) ููุชุจูุง:
Add-Migration ApplyEmployeeDataAnnotations
ุงูู EF Core ููุนู ู ุงูุฎุทูุงุช ุฏู:
- ุงูู
ูุงุฑูุฉ: ูููุงุฑู ุงูู
Employee
class ุงูุญุงูู (ุจุงูู Annotations ุงูุฌุฏูุฏุฉ) ู ุน ุขุฎุฑ Snapshot ู ูุฌูุฏ ุนูุฏู ูู ู ููYourDbContextModelSnapshot.cs
(ุงููู ูุงู ุจูุนูุณ ุงูุญุงูุฉ ุงููุฏูู ุฉ ูุจู ุงูุชุนุฏููุงุช ุฏูุ ุบุงูุจูุง ูุงู ุจูุนุชู ุฏ ุนูู ุงูู Conventions ุจุณ). - ุงูุชุดุงู ุงููุฑููุงุช: ููุนุฑู ุฅูู ุงููู ุงุชุบูุฑ ุจุงูุธุจุท:
- ุงุณู ุงูู Table ุงุชุบูุฑ ูุจูู ูู schema ู ุฎุชูู.
- ุงูู Primary Key ุงุชุบูุฑ ุงุณู ู.
- ุงูู
Name
ุจููRequired
ูุทููู ุงุชุบูุฑ. - ููุน ุงูู
Salary
ุงุชุบูุฑ. - ุงูู
FullInfo
ุงูู ูุฑูุถ ูุชุฌุงูููุง. - (ุงูู Annotations ุจุชุงุนุฉ ุงูู Validation ุฒู
[Range]
ุบุงูุจูุง ู ุด ูุชุธูุฑ ูุชุบููุฑ ูู ุงูู Schema ููุณูุ ููู ุงูู EF Core ู ู ูู ูุณุฌููุง ูู Metadata).
- ุฅูุดุงุก ุงูู Migration File: ููุนู
ู ู
ูู migration ุฌุฏูุฏ (
..._ApplyEmployeeDataAnnotations.cs
).- ุฌูู ุงูู
Up()
method ูุชูุงูู ููุฏ C# ุจููุงุฏู ุนููMigrationBuilder
ุนุดุงู ูุนู ู ุงูุชุนุฏููุงุช ุฏู ูู ุงูุฏุงุชุงุจูุฒ. ู ู ูู ุชูุงูู ุฃูุงู ุฑ ุฒู:- ุงูู
migrationBuilder.EnsureSchema(name: "hr");
(ูู ุงูู schema ู ุด ู ูุฌูุฏ) - ุงูู
migrationBuilder.RenameTable(...)
ุฃูmigrationBuilder.DropTable(...)
ูmigrationBuilder.CreateTable(...)
(ุญุณุจ ุฅุฒุงู ููููู ุงูู table ููู schema ุงูุฌุฏูุฏ ููุบูุฑ ุงุณู ู). - ุงูู
migrationBuilder.RenameColumn(...)
ุฃูmigrationBuilder.DropPrimaryKey(...)
ูmigrationBuilder.AddPrimaryKey(...)
ุนุดุงู ูุบูุฑ ุงูู PK. - ุงูู
migrationBuilder.AlterColumn(...)
ูุฐุง ู ุฑุฉ ุนุดุงู ูุบูุฑ ููุนSalary
ููุบูุฑ ุทูู ูููุนName
ููุฎูููNOT NULL
.
- ุงูู
- ุงูู
Down()
method ููุจูู ูููุง ุงูุฃูุงู ุฑ ุงูุนูุณูุฉ ุนุดุงู ูู ุญุจูุช ุชุนู ู Rollback.
- ุฌูู ุงูู
- ุชุญุฏูุซ ุงูู Snapshot: ู
ูู ุงูู
YourDbContextModelSnapshot.cs
ููุชุนุฏู ุนุดุงู ูุนูุณ ุงูุดูู ุงูุฌุฏูุฏ ูููEmployee
model ุจูู ุชูุงุตููู ุงูุฌุฏูุฏุฉ ุงููู ุฌุงูุฉ ู ู ุงูู Annotations.
ูุจุนุฏ ู
ุง ุงูู Migration ุฏู ุชุชุนู
ูุ ูู ููุฐุช Update-Database
ูู ุงูู PMุ ูู ุงูุชุบููุฑุงุช ุฏู ูุชุชุทุจู ุนูู ุงูุฏุงุชุงุจูุฒ ุจุชุงุนุชู.
ุงูุฎูุงุตุฉ ููุทุฑููุฉ ุงูุชุงููุฉ: ุงูู Data Annotations ุจุชุฏููุง ุชุญูู ุฃูุจุฑ ุจูุชูุฑ ู ู ุงูู Conventionsุ ูุจุชุฎูููุง ููุฏุฑ ูุนู ู mapping ู validation ูู ููุณ ุงูููุช ุจูุชุงุจุฉ attributes ุจุณูุทุฉ ููู ุงูู model classes. ุฏู ุทุฑููุฉ ุดุงุฆุนุฉ ุฌุฏูุง ูู ููุฏุฉุ ุฎุตูุตูุง ูู ASP.NET Core. ุจุณ ุนูุจูุง ุฅููุง ู ู ูู ุชุฎูู ุงูู POCO classes ุจุชุงุนุชูุง ูููุง ุชูุงุตูู ูููุง ุนูุงูุฉ ุจุงูู Infrastructure (ุงูุฏุงุชุงุจูุฒ ุฃู ุงูู validation)ุ ูุฏู ู ู ูู ูุงุณ ุชุนุชุจุฑู ุจูุฎุงูู ู ุจุฏุฃ Separation of Concerns. ุนุดุงู ูุฏู ููู ุทุฑููุฉ ุชุงูุชุฉ (Fluent API) ุจุชูุตู ุงูู configuration ุฏู ุชู ุงู ูุง ูู ู ูุงู ููุญุฏู.
3. Fluent API (ุงูุชุญูู ุงููุงู ู)
ุฏู ุงูุทุฑููุฉ ุงูุฃููู ูุงูุฃูุซุฑ ู ุฑููุฉ ูู ุงูู Mapping. ููู ุฉ Fluent ููุง ู ุนูุงูุง ุฅู ุงูููุฏ ุงููู ุจููุชุจู ุจูููู ุณูุณ ูุดุจู ุงูุฌู ู ุงูุฅูุฌููุฒูุฉ ุดููุฉ.
-
ุฅู ุชู ุจูุณุชุฎุฏู ูุงุ ุจููุฌุฃ ููู Fluent API ุบุงูุจูุง ูู ุณููุงุฑููููู ุฃุณุงุณููู:
- ุญุงุฌุงุช ู
ูููุนุด ุชุชุนู
ู ุบูุฑ ุจููุง: ูู ุนุงูุฒ ุชุนู
ู configurations ู
ุนูุฏุฉ ุดููุฉ ุฃู ุญุงุฌุงุช ู
ุด ู
ุฏุนูู
ุฉ ูู ุงูู Conventions ุฃู ุงูู Data Annotations. ุฃู
ุซูุฉ:
- ุงูู Composite Primary Key: ูู ุงูู Primary Key ุจุชุงุนู ู ููู ู ู ุฃูุชุฑ ู ู column ูุงุญุฏ.
- ุชุบููุฑ ุงูู Increment Step: ูู ุนุงูุฒ ุงูู Identity column ูุฒูุฏ ุจู ูุฏุงุฑ ู ุฎุชูู ุนู 1 (ู ุซููุง ูุฒูุฏ 5 ูู ู ุฑุฉ).
- ุชุญุฏูุฏ Default Value ุฏููุงู ููู: ูู ุนุงูุฒ ุชุญุท ููู ุฉ ุงูุชุฑุงุถูุฉ ูู column ุจุณ ุงูููู ุฉ ุฏู ุจุชุชุญุณุจ ู ู ุงูุฏุงุชุงุจูุฒ ููุณูุง (ุฒู ุชุงุฑูุฎ ูููุช ุงูุฅุถุงูุฉ ุงููุนูู).
- ุนู ู Indexes ู ุนูุฏุฉ: ูู ุนุงูุฒ ุชุนู ู index ุนูู ุฃูุชุฑ ู ู column ุฃู index ู ู ููุน ุฎุงุต.
- ุชุญุฏูุฏ ุชูุงุตูู ุฏูููุฉ ูู ุงูุนูุงูุงุช (Relationships): ุฒู ุชุญุฏูุฏ ุฃุณู ุงุก ุงูู Foreign Keys ุฃู ุณููู ุงูุญุฐู (Cascade Delete) ุจุดูู ุฏููู ุฌุฏูุง.
- ูู ู
ุด ู
ุนุงู ุงูู Source Code: ุชุฎูู ุฅู ุงูู Entity Class ุจุชุงุนู (ุฒู
Employee
ุฃูDepartment
) ุฌุงููู ู ู library ุชุงููุฉ ุฃู ู ู ุชูู ุชุงููุ ูุฅูุช ู ุด ู ุนุงู ุงูููุฏ ุงูู ุตุฏุฑู (Source Code) ุจุชุงุนูุ ู ุนุงู ุจุณ ุงูู ูู ุงูู compiled (ุฒู ุงูู.dll
ุงููู ููู ุงูู IL code). ูู ุงูุญุงูุฉ ุฏูุ ุฅูุช ู ุด ูุชูุฏุฑ ุชูุชุญ ุงูููุงุณ ูุชุถูู ุนููู Data Annotations. ุงูุญู ููุง ูู ุฅูู ุชุณุชุฎุฏู Fluent API ุนุดุงู ุชุนู ู ูู ุงูู configuration ูุงูู mapping ุงูู ุทููุจ ููููุงุณ ุฏู ู ู ู ูุงู ุฎุงุฑุฌู (ุงููู ูู ุงููDbContext
).
- ุญุงุฌุงุช ู
ูููุนุด ุชุชุนู
ู ุบูุฑ ุจููุง: ูู ุนุงูุฒ ุชุนู
ู configurations ู
ุนูุฏุฉ ุดููุฉ ุฃู ุญุงุฌุงุช ู
ุด ู
ุฏุนูู
ุฉ ูู ุงูู Conventions ุฃู ุงูู Data Annotations. ุฃู
ุซูุฉ:
-
ุจููุชุจูุง ูููุ ุงูู Configurations ุจุชุงุนุฉ ุงูู Fluent API ุจุชุชูุชุจ ุฌูู ุงูู
DbContext
ุจุชุงุนูุง. ุจูุนู ูoverride
ูู method ู ูู ุฉ ุฌุฏูุง ุงุณู ูุงOnModelCreating
. ุงูู Method ุฏู ุงูู EF Core ุจููุงุฏู ุนูููุง ู ุฑุฉ ูุงุญุฏุฉ ูู ุง ูุฌู ูุจูู ุงูู model ุจุชุงุนู ูู ุงูุฐุงูุฑุฉ.
// Inside your DbContext class (e.g., CompanyDbContext)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// --- Fluent API Configurations Go Here ---
// Example: Set a default value for an 'Address' property in Employee
// Assuming Employee class has an Address property now
modelBuilder.Entity<Employee>() // Start configuring the Employee entity
.Property(e => e.Address) // Select the Address property using Lambda (BEST WAY)
.HasDefaultValue("Cairo"); // Set its default value in the database
// Example using nameof (Second best)
// modelBuilder.Entity<Employee>()
// .Property(nameof(Employee.Address))
// .HasDefaultValue("Cairo");
// Example using string (NOT Recommended - no compile-time check)
// modelBuilder.Entity<Employee>()
// .Property("Address") // Prone to typos if property name changes
// .HasDefaultValue("Cairo");
// --- IMPORTANT: Call the base method at the end ---
base.OnModelCreating(modelBuilder);
}
- ุดุฑุญ
Property()
Method:- ุงูู Method ุฏู ุงููู ุจูุณุชุฎุฏู ูุง ุนุดุงู ูุฎุชุงุฑ property ู ุนููุฉ ุฌูู ุงูู Entity ููุจุฏุฃ ูุนู ู ููุง configuration. ุจุชุงุฎุฏ ุงุณู ุงูู property ูู input.
- ุงูุทุฑููุฉ ุงูุฃููู (String - ู
ุด ูููุณุฉ): ุงูู ุชูุชุจ ุงุณู
ุงูู property ูู string (
"Address"
). ู ุดููุชูุง ุฅู ูู ุบูุฑุช ุงุณู ุงูู property ูู ุงูููุงุณ ุงูุฃุตูู ุฃู ูุชุจุช ุงูุงุณู ุบูุท ููุงุ ุงูููุฏ ููุนู ู compile ุนุงุฏูุ ูู ุด ูุชูุชุดู ุงูู ุดููุฉ ุบูุฑ ููุช ุงูู runtime (ูู ุง ุชูุฌู ุชุดุบู ุงูุจุฑูุงู ุฌ ุฃู ุชุนู ู migration). - ุงูุทุฑููุฉ ุงูุชุงููุฉ (
nameof
- ุฃุญุณู): ุชุณุชุฎุฏูnameof(Employee.Address)
. ุฏู ุฃุญุณู ู ู ุงูู string ูุฃู ูู ุงุณู ุงูู property ุงุชุบูุฑุ ุงูููุฏ ุฏู ู ุด ููุนู ู compile ููุชุนุฑู ุงูุบูุท ุจุฏุฑู. - ุงูุทุฑููุฉ ุงูุชุงูุชุฉ (Lambda Expression - ุงูุฃูุถู ูุงูุฃุถู
ู): ุฅูู ุชุณุชุฎุฏู
Lambda expression ุฒู
e => e.Address
. ุฏู ุฃุญุณู ูุฃุถู ู ุทุฑููุฉ ูุฃููุง ุจุชุณุชุฎุฏู Strongly-typed Accessุ ูุนูู ุงูู compiler ุจูุชุฃูุฏ ุฅู ุงูู property ุฏู ู ูุฌูุฏุฉ ูุนููุง ูู ุงููEmployee
class ููุช ุงูู compile. ููู ุงู ุจุชุฏุนู ุงูู Refactoring (ูู ุบูุฑุช ุงุณู ุงูู property ุจุงุณุชุฎุฏุงู ุฃุฏูุงุช ุงูู IDEุ ูุชุชุบูุฑ ููุง ูู ุงู).
ุฅูู ุงูุญุงุฌุงุช ุงููู ู ู ูู ุฃุนู ููุง ุจุงูู Fluent APIุ (ุฃู ุซูุฉ ุจุณูุทุฉ)
ุงูู Fluent API ุจุชุบุทู ุชูุฑูุจูุง ูู ุญุงุฌุฉ ู ู ูู ุชุญุชุงุฌูุง ูู ุงูู Mapping:
- ุชุญุฏูุฏ ุงูู Table ูุงูู Schema:
modelBuilder.Entity<Employee>().ToTable("EmployeesInfo", schema: "hr");
- ุชุญุฏูุฏ ุงูู Primary Key:
modelBuilder.Entity<Employee>().HasKey(e => e.EmpId); // Single PK modelBuilder.Entity<OrderLine>().HasKey(ol => new { ol.OrderId, ol.ProductId }); // Composite PK
- ุชุญุฏูุฏ ุงูู Column:
modelBuilder.Entity<Employee>() .Property(e => e.Name) .HasColumnName("EmployeeFullName") // Change column name .HasColumnType("varchar(150)") // Change data type and length .IsRequired(); // Make it NOT NULL
- ุงูู Default Values:
modelBuilder.Entity<Employee>() .Property(e => e.Status) .HasDefaultValue("Active"); // Default string value
- ุงูู Computed Columns (ููู
ู
ุญุณูุจุฉ ูู ุงูุฏุงุชุงุจูุฒ):
modelBuilder.Entity<Employee>() .Property(e => e.FullName) // Assume FullName is string in C# .HasComputedColumnSql("[LastName] + ', ' + [FirstName]"); // SQL expression
- ู
ูู
: ุฒู ู
ุง ููุดููุ ูู ุนุงูุฒ ููู
ุฉ ุจุชุชุบูุฑ ู
ุน ุงูููุช ุฒู ุชุงุฑูุฎ ุงูุฅูุดุงุกุ ุงุณุชุฎุฏู
HasComputedColumnSql
ู ุน ุฏุงูุฉ ุงูุฏุงุชุงุจูุฒ (ุฒูGETDATE()
ูู SQL Server) ุจุฏูHasDefaultValue(DateTime.Now)
.
- ู
ูู
: ุฒู ู
ุง ููุดููุ ูู ุนุงูุฒ ููู
ุฉ ุจุชุชุบูุฑ ู
ุน ุงูููุช ุฒู ุชุงุฑูุฎ ุงูุฅูุดุงุกุ ุงุณุชุฎุฏู
- ุงูู Identity / Auto-increment:
modelBuilder.Entity<Employee>() .Property(e => e.EmpId) .UseIdentityColumn(seed: 100, increment: 5); // Start at 100, increment by 5
- ุชุฌุงูู Property (ุฒู
[NotMapped]
):modelBuilder.Entity<Employee>().Ignore(e => e.TemporaryNotes);
- ุนู
ู Index:
modelBuilder.Entity<Employee>() .HasIndex(e => e.Email) // Index on Email .IsUnique(); // Make it a unique index modelBuilder.Entity<Employee>() .HasIndex(e => new { e.LastName, e.FirstName }); // Index on multiple columns
- ุชุญุฏูุฏ ุงูุนูุงูุงุช (Relationships): (ูุฏู ูููุง ุชูุงุตูู ูุชูุฑ ุจุณ ูู
ุซุงู ุจุณูุท)
// One-to-Many: Department has many Employees modelBuilder.Entity<Employee>() .HasOne(e => e.Department) // Navigation property in Employee .WithMany(d => d.Employees) // Navigation property in Department .HasForeignKey(e => e.DeptId) // Foreign key property in Employee .OnDelete(DeleteBehavior.Restrict); // Define delete behavior
ู
ุซุงู ุชูุตููู: Mapping ูููุงุณ Department
(ุจุฏูู Source Code)
ููุฑุฌุน ูุณููุงุฑูู ุฅููุง ุนูุฏูุง Class ุงุณู
ู Department
ุฌุงู ู
ู library ุชุงููุฉุ ูุฅุญูุง ู
ุนูุฏูุงุด ุงูููุฏ ุจุชุงุนู ุนุดุงู ูุญุท ุนููู Annotations. ูููุชุฑุถ ุฅู ุดูู ุงูููุงุณ ุฏู ูุงู ุญุงุฌุฉ ุฒู ูุฏู (ุฅุญูุง ู
ุด ุจููุชุจ ุงูููุงุณ ุฏูุ ูู ุฌุงู ุฌุงูุฒ):
// Imagine this class comes from a compiled library (DLL)
// We cannot modify it directly
public class Department
{
public int DeptId { get; set; } // Needs to be PK, needs Identity with custom seed/step
public string Name { get; set; } // Needs to be required, varchar(50), different column name, default value
public DateTime DateOfCreation { get; set; } // Needs DB default GETDATE()
}
ุฏูููุชูุ ูู ุงูู DbContext
ุจุชุงุนูุงุ ููุนู
ู ุงูุขุชู:
-
ูุถูู ูู
DbSet
: (ุญุชู ูู ุฌุงู ู ู libraryุ ูุงุฒู ูุนุฑู ุงููDbContext
ุฅููุง ุนุงูุฒูู ูุชุนุงู ู ู ุนุงู)// Inside CompanyDbContext public DbSet<Department> Departments { get; set; }
-
ูุนู ู ูู Configuration ูู
OnModelCreating
ุจุงุณุชุฎุฏุงู Fluent API:protected override void OnModelCreating(ModelBuilder modelBuilder) { // --- Configure Employee (as before maybe) --- // modelBuilder.Entity<Employee>()... // --- Configure Department using Fluent API --- modelBuilder.Entity<Department>(E => // Use lambda for cleaner syntax { // Map to specific Table name and Schema E.ToTable("Departments", "hr"); // Map to hr.Departments table // Define the Primary Key (since it's not named 'Id' or 'DepartmentId') E.HasKey(D => D.DeptId); // Configure the Primary Key property to be Identity with custom seed and increment E.Property(D => D.DeptId) .UseIdentityColumn(seed: 10, increment: 10); // Start at 10, increment by 10 // Configure the 'Name' property E.Property(D => D.Name) .IsRequired(true) // Make it NOT NULL .HasColumnType("varchar(50)") // Set DB type and length .HasColumnName("DepartmentName") // Change column name in DB .HasMaxLength(50) // Also specifies max length (can be redundant with TypeName) // .HasAnnotation("SomeMetadata", "Value") // Way to add custom metadata if needed .HasDefaultValue("Default Dept"); // Set a static default value // Configure the 'DateOfCreation' property E.Property(D => D.DateOfCreation) // WRONG WAY for dynamic default: .HasDefaultValue(DateTime.Now); // This captures the time when the MIGRATION is created, not when the row is inserted! // RIGHT WAY: Use a database function for the default value .HasComputedColumnSql("GETDATE()"); // For SQL Server, generates default value on insert // Or alternatively for default constraint: .HasDefaultValueSql("GETDATE()"); }); // --- Call base method --- base.OnModelCreating(modelBuilder); }
- ุดุฑุญ ุณุฑูุน ููููุท ุงูู
ูู
ุฉ ูู ุงูู
ุซุงู ุฏู:
- ุงุณุชุฎุฏู
ูุง
Entity<Department>(E => { ... })
ุนุดุงู ููู ุงูู configurations ุจุชุงุนุฉDepartment
ู ุน ุจุนุถุ ูุฏู ุทุฑููุฉ ุฃุฌุฏุฏ ูุฃูุถู (ู ูุฌูุฏุฉ ู ู EF Core 3.1 ุชูุฑูุจูุง). - ุงูู
ToTable()
ุญุฏุฏุช ุงุณู ุงูู Table ูุงูู Schema. - ุงูู
HasKey()
ูุงูุช ุถุฑูุฑูุฉ ูุฃู ุงุณู ุงูู property (DeptId
) ู ุด ู ุงุดู ู ุน ุงูู Convention ุจุชุงุนุฉ ุงูู PK. - ุงูู
UseIdentityColumn(10, 10)
ุฏู ู ูุฏุฑูุงุด ูุนู ููุง ุจุงูู Annotationุ ููุง ุจูุญุฏุฏ ุจุฏุงูุฉ ุงูุนุฏ (10) ูู ูุฏุงุฑ ุงูุฒูุงุฏุฉ (10). - ูู
Property(D => D.Name)
ุดูููุง ุฅุฒุงู ู ู ูู ูุนู ู ูุฐุง configuration ูุฑุง ุจุนุถ ูููุณ ุงูู property. - ูู
Property(D => D.DateOfCreation)
ุ ุงูููุทุฉ ุจุชุงุนุฉHasComputedColumnSql("GETDATE()")
ุฃูHasDefaultValueSql("GETDATE()")
ู ูู ุฉ ุฌุฏูุง. ูู ููุช ุงุณุชุฎุฏู ุชHasDefaultValue(DateTime.Now)
ุ ูุงูุช ููู ุฉDateTime.Now
ุงููู ูุชุชููุฐ ููุช ุนู ู ุงูู Migration ูู ุงููู ูุชุชุญุท ูููู ุฉ ุงูุชุฑุงุถูุฉ ุซุงุจุชุฉ ูู ุงูุฏุงุชุงุจูุฒุ ูุฏู ู ุด ุตุญ ูู ุนุงูุฒ ุงูุชุงุฑูุฎ ุงููุนูู ูุฅุถุงูุฉ ุงูู row. ุงุณุชุฎุฏุงู ุฏุงูุฉ ุงูุฏุงุชุงุจูุฒ ุฒูGETDATE()
ุจูุถู ู ุฅู ุงูููู ุฉ ุชุชุญุณุจ ุตุญ ููุช ุงููINSERT
.
- ุงุณุชุฎุฏู
ูุง
4. Configuration Classes (Organize Fluent API)
ุงูู Fluent API ูููุฉ ุฌุฏูุงุ ุจุณ ููู ู
ุดููุฉ ู
ู
ูู ุชุธูุฑ: ูู ุงูุฃุจูููุดู ุจุชุงุนู ูุจูุฑ ูููู Entities ูุชูุฑุ ุงูู OnModelCreating
method ุฏู ูุชุจูู ุทูููุฉ ุฌุฏูุง ูู
ููุงูุฉ configurations ูู
ู
ูู ุชุจูู ุตุนุจุฉ ูู ุงููุฑุงูุฉ ูุงูุตูุงูุฉ.
ููุง ุชูุฌู ุงูุทุฑููุฉ ุงูุฑุงุจุนุฉุ ููู ูู ุงูุญูููุฉ ู ุด ุทุฑููุฉ mapping ุฌุฏูุฏุฉุ ูุฏ ู ุง ูู ุทุฑููุฉ ุชูุธูู ูุฉ ููุทุฑููุฉ ุงูุชุงูุชุฉ (Fluent API).
- ุงูููุฑุฉ: ุจุฏู ู
ุง ุชูุชุจ ูู ุงูู Fluent API configurations ุจุชุงุนุฉ ูู ุงูู Entities ุฌูู
OnModelCreating
ุ ูุชุนู ู Class ู ููุตู ููู Entity ุนุดุงู ุชุญุท ุฌูุงู ุงูู configurations ุจุชุงุนุชู. - ุงูุฎุทูุงุช:
- ุนู
ู Folder: ูุนู
ู folder ุฌุฏูุฏ ูู ุงูู Project ุนุดุงู ููุธู
ุงูู configuration classes ุฏูุ ูุณู
ูู ู
ุซููุง
Configurations
ุฃูEntityConfigurations
. - ุนู
ู Class ููู Entity: ููู Entity ุนุงูุฒ ุชุนู
ููุง configuration (ุฒู
Employee
,Department
)ุ ูุชุนู ู Class ุฌุฏูุฏ ุฌูู ุงูู folder ุฏู. ุงุณู ุงูู Class ุฏู ุนุงุฏุฉ ุจููููEntityNameConfiguration
(ู ุซููุงEmployeeConfiguration
,DepartmentConfiguration
). - ุนู
ู Implement ููู Interface: ูู configuration class ู
ู ุฏูู ูุงุฒู
ูุนู
ู
implement
ูู interface ู ูู ุงุณู ูIEntityTypeConfiguration<TEntity>
. ุงููTEntity
ููุง ูู ุงุณู ุงูู Entity class ุงููู ุงูู configuration class ุฏู ู ุณุฆูู ุนูู.- ุงูู Interface ุฏู ููู method ูุงุญุฏุฉ ุจุณ ุงุณู
ูุง
Configure
. ุฌูู ุงููConfigure
ุฏู ุจูู ูุชุญุท ูู ููุฏ ุงูู Fluent API ุงููู ููุช ูุชูุชุจู ููOnModelCreating
ุจุณ ููู Entity ุฏู ุจุณ.
- ุงูู Interface ุฏู ููู method ูุงุญุฏุฉ ุจุณ ุงุณู
ูุง
- ุนู
ู Folder: ูุนู
ู folder ุฌุฏูุฏ ูู ุงูู Project ุนุดุงู ููุธู
ุงูู configuration classes ุฏูุ ูุณู
ูู ู
ุซููุง
ู
ุซุงู: ุนู
ู DepartmentConfiguration
// File: Configurations/DepartmentConfiguration.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
// Assuming Department class is accessible here
internal class DepartmentConfiguration : IEntityTypeConfiguration<Department>
{
public void Configure(EntityTypeBuilder<Department> builder) // Note: It's EntityTypeBuilder here, not ModelBuilder
{
// --- All Fluent API for Department goes here ---
// Move the code from OnModelCreating here, replacing 'E.' with 'builder.'
builder.ToTable("Departments", "hr");
builder.HasKey(D => D.DeptId);
builder.Property(D => D.DeptId)
.UseIdentityColumn(seed: 10, increment: 10);
builder.Property(D => D.Name)
.IsRequired(true)
.HasColumnType("varchar(50)")
.HasColumnName("DepartmentName")
.HasMaxLength(50)
.HasDefaultValue("Default Dept");
builder.Property(D => D.DateOfCreation)
.HasComputedColumnSql("GETDATE()");
// .HasDefaultValueSql("GETDATE()"); // Alternative
}
}
ุฅุฒุงู ุงูู DbContext
ูุนุฑู ุจุงูู Configuration Classes ุฏูุ
ุจุนุฏ ู
ุง ุนู
ูุช ุงูู Configuration Class (ุฒู DepartmentConfiguration
)ุ ูุงุฒู
ุชุฑุฌุน ููู DbContext
ูุชูููู ูุณุชุฎุฏู
ุงูู configuration ุฏู. ุจูุนู
ู ุฏู ุฌูู OnModelCreating
ุจุฑุถูุ ุจุณ ุจุฏู ู
ุง ููุชุจ ุงูููุฏ ูููุ ููุงุฏู ุนูู ุงูู configuration class.
-
ุงูุทุฑููุฉ ุงูู ุจุงุดุฑุฉ (ููู ููุงุณ ููุญุฏู):
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Apply the Department configuration modelBuilder.ApplyConfiguration(new DepartmentConfiguration()); // Apply other configurations if you have them // modelBuilder.ApplyConfiguration(new EmployeeConfiguration()); // ... etc ... // --- IMPORTANT: Call the base method at the end --- base.OnModelCreating(modelBuilder); }
- ุจูุณุชุฎุฏู
modelBuilder.ApplyConfiguration()
ููุฏููุง instance ุฌุฏูุฏุฉ ู ู ุงูู configuration class ุจุชุงุนูุง.
- ุจูุณุชุฎุฏู
-
ูุงูุฏุฉ
base.OnModelCreating(modelBuilder);
:- ุงูุณุทุฑ ุฏู ู
ูู
ุฌุฏูุง ูู
ูุฑูุถ ูุณูุจู ูู ุงูุขุฎุฑ ุบุงูุจูุง. ูุงูุฏุชู ุฅูู ุจูุชุฃูุฏ ุฅู ุฃู configurations ุชุงููุฉ ุงูู EF Core ู
ู
ูู ูููู ุจูุนู
ููุง ููุญุฏู (ูุฌุฒุก ู
ู ุงูู conventions ุจุชุงุนุชู ุฃู ูู ุงูู
DbContext
ุจุชุงุนู ูุงุฑุซ ู ูDbContext
ุชุงูู ูููOnModelCreating
) ุชุชููุฐ ูู ูู ุงู. ูู ุดููุชูุ ู ู ูู ุจุนุถ ุงูุณููููุงุช ุงูุงูุชุฑุงุถูุฉ ุฃู ุงููุฑุงุซูุฉ ู ุชุดุชุบูุด.
- ุงูุณุทุฑ ุฏู ู
ูู
ุฌุฏูุง ูู
ูุฑูุถ ูุณูุจู ูู ุงูุขุฎุฑ ุบุงูุจูุง. ูุงูุฏุชู ุฅูู ุจูุชุฃูุฏ ุฅู ุฃู configurations ุชุงููุฉ ุงูู EF Core ู
ู
ูู ูููู ุจูุนู
ููุง ููุญุฏู (ูุฌุฒุก ู
ู ุงูู conventions ุจุชุงุนุชู ุฃู ูู ุงูู
-
ุงูุทุฑููุฉ ุงูุฃูุชูู ุงุชูููุฉ (ุจุงุณุชุฎุฏุงู Reflection):
- ูู ุนูุฏู configuration classes ูุชูุฑุ ุจุฏู ู
ุง ุชูุนุฏ ุชุถูู ุณุทุฑ
ApplyConfiguration
ููู ูุงุญุฏ ูููู ุ ููู ุทุฑููุฉ ุฃุดูู ูุฃูุชูู ุงุชูู ุฃูุชุฑ ุจุชุณุชุฎุฏู Reflection. ุงูุทุฑููุฉ ุฏู ุจุชุฎูู ุงูู EF Core ูุฏูุฑ ุจููุณู ุนูู ูู ุงูู Classes ูู ุงูู Assembly (ุงูู project) ุจุชุงุนู ุงููู ุจุชุนู ูimplement
ูููIEntityTypeConfiguration<T>
ููุฑูุญ ุนุงู ููุงapply
ููุญุฏู. - ุงูููุฏ ุจุชุงุนูุง ุจูุจูู ุญุงุฌุฉ ุฒู ูุฏู:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // Automatically apply all configurations from the current assembly modelBuilder.ApplyConfigurationsFromAssembly(System.Reflection.Assembly.GetExecutingAssembly()); // No need to call ApplyConfiguration for each class manually anymore // --- IMPORTANT: Call the base method at the end --- base.OnModelCreating(modelBuilder); }
- ุงูุณุทุฑ ุฏู ูุงูู ุฅูู ููุงูู ููููุฐ ูู ุงูู configuration classes ุงููู ูู ุงูู project ุจุชุงุนู. ุฏู ุงูุทุฑููุฉ ุงูู ูุถูุฉ ูู ุงูู ุดุงุฑูุน ุงููุจูุฑุฉ.
- ูู ุนูุฏู configuration classes ูุชูุฑุ ุจุฏู ู
ุง ุชูุนุฏ ุชุถูู ุณุทุฑ
ุงูุฎุทูุฉ ุงูุฃุฎูุฑุฉ: ุนู ู ุงูู Migration
ุจุนุฏ ู
ุง ุฎูุตุช ูู ุงูู configurations ุจุชุงุนุชู ุจุงุณุชุฎุฏุงู
Fluent API (ุณูุงุก ูุชุจุชูุง ู
ุจุงุดุฑุฉ ูู OnModelCreating
ุฃู ูุธู
ุชูุง ูู Configuration Classes)ุ ุงูุฎุทูุฉ ุงูุฌุงูุฉ ูู ุฅูู ุชุนู
ู Managing Database Schema with EF Core Migrations ุนุดุงู ุชุดูู ุงูุชุบููุฑุงุช ุฏู ูุชุทุจููุง ุนูู ุงูุฏุงุชุงุจูุฒ.
- ุงูุชุญ ุงูู Package Manager Console (PM).
- ุงูุชุจ ุฃู
ุฑ ุงูู Add-Migration:
(ุฃู ุฃู ุงุณู ู ูุงุณุจ ููุตู ุงูุชุบููุฑุงุช ุงููู ุนู ูุชูุง).Add-Migration ConfigureDepartmentUsingFluentApi
- ููุง ุงูู EF Core ูููุฑุฃ ุงูู configurations ุจุชุงุนุชู (ุจู
ุง ูููุง ุงููู ุฌุงูุฉ ู
ู ุงูู Fluent API) ูููุงุฑููุง ุจุงูู Snapshot ุงููุฏูู
ุ ููุนู
ู migration file ุฌุฏูุฏ ุจุงููุฑู. ุงูู
ูุฑูุถ ุชูุชุญ ุงููุงูู ุฏู ูุชุชุฃูุฏ ุฅู ุงูู
Up()
method ูููุง ุงูุฃูุงู ุฑ ุงููู ุฅูุช ู ุชููุนูุง (ุฒูCreateTable
ุฃูAlterColumn
ุจุงูุชูุงุตูู ุงูุฌุฏูุฏุฉ).
- ููุง ุงูู EF Core ูููุฑุฃ ุงูู configurations ุจุชุงุนุชู (ุจู
ุง ูููุง ุงููู ุฌุงูุฉ ู
ู ุงูู Fluent API) ูููุงุฑููุง ุจุงูู Snapshot ุงููุฏูู
ุ ููุนู
ู migration file ุฌุฏูุฏ ุจุงููุฑู. ุงูู
ูุฑูุถ ุชูุชุญ ุงููุงูู ุฏู ูุชุชุฃูุฏ ุฅู ุงูู
- ุงูุชุจ ุฃู
ุฑ ุงูู Update-Database:
Update-Database
- ุฏู ููููุฐ ุงูู Migration ุงูุฌุฏูุฏุฉ ุฏู ุนูู ุงูุฏุงุชุงุจูุฒ ุจุชุงุนุชู.
ูุจูุฏู ุชููู ูุฏุฑุช ุชุนู ู mapping ู configuration ุจุดูู ุฏููู ูู ูุตู ุจุงุณุชุฎุฏุงู Fluent API ููุธู ุช ุงูููุฏ ุจุชุงุนู ุจุงุณุชุฎุฏุงู Configuration Classes. ุฏู ุชุนุชุจุฑ ุงูุทุฑููุฉ ุงูุฃูุซุฑ ุงุญุชุฑุงููุฉ ููุชุนุงู ู ู ุน ุงูู Mapping ูู ุงูู EF Core Code-First ูู ุงูู ุดุงุฑูุน ุงููุจูุฑุฉ ูุงูู ุนูุฏุฉ.