【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太多高级特性的时候谨慎,尽量不要和业务逻辑混合在一起,以免“不能自拔”。比如IgnoreShadowTable Splitting……

全局过滤器

EF Core 会自动将这个查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。
场景:软删除、多租户。
配置全局过滤器:

modelBuilder.HasQueryFilter(b=>b.IsDeleted==false);

之后所有的查询都会自动带上IsDeleted=0这个条件
忽略全局过滤器:

ctx.Books.IgnoreQueryFilters().Where(b => b.Title.Contains("o")).ToArray();
posted @ 2022-04-17 12:01  .Neterr  阅读(196)  评论(0编辑  收藏  举报