映射模型
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());
}
}
就是这样。我们都准备好了。