對映模型

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.ConfigurationsOnModelCreating 方法:

public class DbContext()
    : base("Name=DbContext")
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new EmployeeMap());
    }
}

就是這樣。我們都準備好了。