Entity Framework Core-Fluent API

文章介绍了如何使用EFCore的FluentAPI来配置实体模型,包括设置主键、配置属性列名、默认值以及表关系等。示例展示了Country实体类的配置,如将Name属性映射为CountryName并设置默认值,以及添加和忽略特定属性。此外,还提到了Has/With模式在配置关联关系中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EF Core API 用来构建基于实体类的模型,我们可以使用Fluent API重写EF Core 默认契约,Fluent API 比默认契约和Data Annotations优先级更高

EF Core Fluent API提供了下面特性

模型配置:配置EF 模型到数据库的映射

实体配置:配置主键,备用键,索引,表名,一对一,一对多,多对多关系等

属性配置:配置属性到列的映射,例如:列名,默认值,可空、外键、数据类型等

1 EF Core Fluent API例子

假如我们有一个Country的实体类

public class Country
{
    public int PId { get; set; }
    public string Name { get; set; }
    public DateTime AddedOn { get; set; }
}

我们在DbContext类OnModelCreating()方法内完成EF Core Fluent API的配置

public class CountryContext : DbContext
{
    public CompanyContext(DbContextOptions<CompanyContext> options) : base(options)
    {
    }
    public DbSet<Country> Country { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Write Fluent API configurations here
        //Entity Configuration
        modelBuilder.Entity<Country>().HasKey(s => s.PId);
        //Property Configurations
        modelBuilder.Entity<Country>(entity =>
        {
            entity.Property(e => e.Name)
                  .HasColumnName("CountryName")
                  .HasDefaultValue("USA")
                  .IsRequired();


            entity.Property(e => e.AddedOn)
                  .HasColumnType("date")
                  .HasDefaultValueSql("(getdate())");
        });
        modelBuilder.Entity<Country>().Ignore(e => e.population); 
    }
}

在上面代码我们配置Country实体类:

Line 11: 使用HasKey()函数设置PId属性作为主键

Line 15-18:配置Name属性在数据库表中对应的列是CountryName,并且该列使用了一个USA默认值,IsRequired() 方法确保该列不为空

Line 21, 22 :AddedOn 属性默认设置为日期类型,并且使用了getdate()函数获取默认值

Line 24 :  使用Ignore() 方法指定Population属性不会在数据库表中创建列

注意:你可以在OnModelCreating 方法内将另外一些实体的配置,使用EF Core Migrations命令生成对应的表

2 Fluent API 方法

下面表中我们列举出了EF Core大多数常用的 Fluent API

类型

Fluent API方法

用途

模型配置

HasDbFunction()

配置数据库序列

模型配置

HasSequence()

配置数据库序列

模型配置

HasDefaultSchema()

指定数据库schema

实体配置

HasIndex()

配置属性作为索引

实体配置

ToTable()

配置实体对应的数据库中表的名称

实体配置HasKey()
设置属性作为表主键
实体配置HasNoKey()
表明实体没有主键,此类实体从不会跟踪,此实体也不会在数据库中做增删改查

实体配置

HasOne()

是一对一或者一对多关系的一部分
实体配置HasMany()
配置一对多关系

实体配置

WithOne()

是一对一或者一对多关系的一部分

实体配置WithMany()
用来配置一对多关系

实体配置

HasForeignKey()

配置属性作为外键

实体配置Ignore()
指定属性将不会映射到数据库表中

实体配置

HasConstraintName()

指定外键约束名称

属性配置HasColumnName()
指定属性对应数据库列名称
属性配置HasColumnType()
指定属性对应数据库列类型
属性配置HasDefaultValue()
针对属性在数据库中指定一个默认值
属性配置HasDefaultValueSql()
针对属性在数据库中指定一个默认数据库列的表达式,例如 getdate()
属性配置HasMaxLength()
指定属性对应数据库列最大长度
属性配置IsUnicode()
指定列包含Unicode字符
属性配置ValueGeneratedOnAdd()
保存一个新的实体配置为该属性生成一个默认值

3 Has/With 模式配置关联

使用Fluent API配置表关系时,我们经常会使用Has/With,Has & With 方法一块使用来配置表关系 

Has有两个方法

1 HasOne

2 HasMany

类似的With也有两个方法

1 WithOne

2 WithMany

HasOne和WithOne 方法创建一个引用导航属性,类似的,HasMany和WithMany方法用来创建一个集合导航属性

参考资料

https://www.yogihosting.com/fluent-api-entity-framework-core/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值