【EF Core】Fluent API
Fluent API
- 视图与实体类映射
modelBuilder.Entity<Blog>().ToView("blogsView");
- 排除属性映射
modelBuilder.Entity<Blog>().Ignore(b => b.Name2);
- 配置列名
modelBuilder.Entity<Blog>().Property(b =>b.BlogId).HasColumnName("blog_id");
- 配置列数据类型
builder.Property(e => e.Title) .HasColumnType("varchar(200)")
- 配置主键
默认把名字为Id或者“实体类型+Id“的属性作为主键,可以用HasKey()
来配置其他属性作为主键。
modelBuilder.Entity<Student>().HasKey(c => c.Number);
支持复合主键,但是不建议使用。
- 生成列的值?
modelBuilder.Entity<Student>().Property(b => b.Number).ValueGeneratedOnAdd();
- 为属性设定默认值
modelBuilder.Entity<Student>().Property(b => b.Age).HasDefaultValue(6);
- 索引
modelBuilder.Entity<Blog>().HasIndex(b => b.Url);
- 复合索引
modelBuilder.Entity<Person>().HasIndex(p => new { p.FirstName, p.LastName });
- 唯一索引
modelBuilder.Entity<Blog>().HasIndex(b => b.Url).IsUnique();
- 聚集索引
IsClustered()
- 将私有成员映射成表字段
public record User
{
private string? passwordHash;
}
builder.Property("passwordHash");
- 将DDD值对象映射到当前实体对应的表中
public record User : IAggregateRoot
{
public PhoneNumber PhoneNumber { get; private set; }//手机号
}
builder.OwnsOne(x => x.PhoneNumber, nb => {
nb.Property(x => x.RegionCode).HasMaxLength(5).IsUnicode(false);
nb.Property(x => x.Number).HasMaxLength(20).IsUnicode(false);
});
用EF Core太多高级特性的时候谨慎,尽量不要和业务逻辑混合在一起,以免“不能自拔”。比如
Ignore
、Shadow
、Table Splitting
……
全局过滤器
EF Core 会自动将这个查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。
场景:软删除、多租户。
配置全局过滤器:
modelBuilder.HasQueryFilter(b=>b.IsDeleted==false);
之后所有的查询都会自动带上IsDeleted=0
这个条件
忽略全局过滤器:
ctx.Books.IgnoreQueryFilters().Where(b => b.Title.Contains("o")).ToArray();