對映模型
EntityFramewok Fluent API 是一種將程式碼優先域模型對映到底層資料庫的強大而優雅的方法。這也可以與現有資料庫的程式碼優先使用。使用 Fluent API 時有兩個選項 :你可以直接在 OnModelCreating 方法上對映模型,也可以建立從 EntityTypeConfiguration 繼承的對映器類,然後在 OnModelCreating 方法上將模型新增到 modelBuilder 。第二個選項是我更喜歡的,我將展示它的例子。 ** **
第一步:建立模型
public class Employee
{
public int Id { get; set; }
public string Surname { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public short Age { get; set; }
public decimal MonthlySalary { get; set; }
public string FullName
{
get
{
return $"{Surname} {FirstName} {LastName}";
}
}
}
第二步:建立 mapper 類
public class EmployeeMap
: EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
// Primary key
this.HasKey(m => m.Id);
this.Property(m => m.Id)
.HasColumnType("int")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(m => m.Surname)
.HasMaxLength(50);
this.Property(m => m.FirstName)
.IsRequired()
.HasMaxLength(50);
this.Property(m => m.LastName)
.HasMaxLength(50);
this.Property(m => m.Age)
.HasColumnType("smallint");
this.Property(m => m.MonthlySalary)
.HasColumnType("number")
.HasPrecision(14, 5);
this.Ignore(m => m.FullName);
// Table & column mappings
this.ToTable("TABLE_NAME", "SCHEMA_NAME");
this.Property(m => m.Id).HasColumnName("ID");
this.Property(m => m.Surname).HasColumnName("SURNAME");
this.Property(m => m.FirstName).HasColumnName("FIRST_NAME");
this.Property(m => m.LastName).HasColumnName("LAST_NAME");
this.Property(m => m.Age).HasColumnName("AGE");
this.Property(m => m.MonthlySalary).HasColumnName("MONTHLY_SALARY");
}
}
讓我們解釋一下對映:
- HasKey - 定義主鍵。也可以使用複合主鍵。例如: this.HasKey(m => new {m.DepartmentId,m.PositionId}) 。
- 屬性 - 允許我們配置模型屬性。
- HasColumnType - 指定資料庫級別列型別。請注意,對於 Oracle 和 MS SQL 等不同的資料庫,它可能有所不同。
- HasDatabaseGeneratedOption - 指定是否在資料庫級別計算屬性。數字 PK 是 DatabaseGeneratedOption.Identity ,預設情況下,如果你不希望它們如此,則應指定 DatabaseGeneratedOption.None 。
- HasMaxLength - 限制字串的長度。
- IsRequired - 將該屬性標記為必需品。
- HasPrecision - 讓我們指定小數的精度。
- 忽略 - 完全忽略屬性,不將其對映到資料庫。我們忽略了 FullName,因為我們不希望在我們的表中使用此列。
- ToTable - 為模型指定表名和模式名稱(可選)。
- HasColumnName - 將屬性與列名相關聯。當屬性名稱和列名稱相同時,不需要這樣做。
第三步:將對映類新增到配置中
我們需要告訴 EntityFramework 使用我們的 mapper 類。要做到這一點,我們必須把它新增到 modelBuilder.Configurations 上 OnModelCreating 方法:
public class DbContext()
: base("Name=DbContext")
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new EmployeeMap());
}
}
就是這樣。我們都準備好了。