映射模型

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());
    }
}

就是这样。我们都准备好了。