You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TPC配置下获取抽象类Animal的指定条件实体集合?

解决方案

在EF Core的TPC(每个具体类型一张表)映射策略下,你不需要手动拼接各个派生类的DbSet来查询基类Animal的统一结果,EF Core原生支持直接针对抽象基类构建跨表查询。

方法一:通过DbContext声明基类DbSet

先在你的MainDbContext中添加抽象基类Animal的DbSet声明:

public class MainDbContext : DbContext
{
    public DbSet<Cat> Cats { get; set; }
    public DbSet<Dog> Dogs { get; set; }
    // 添加基类的DbSet声明
    public DbSet<Animal> Animals { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Animal>().UseTpcMappingStrategy();
    }
}

之后直接针对这个DbSet写查询即可:

using var context = new MainDbContext();
var bobAnimals = context.Animals
    .Where(animal => animal.Name == "Bob")
    .ToList();

方法二:直接使用Set方法(无需额外声明DbSet)

如果不想在DbContext中添加基类的DbSet,可以直接调用context.Set<Animal>()来获取基类的查询入口:

using var context = new MainDbContext();
var bobAnimals = context.Set<Animal>()
    .Where(animal => animal.Name == "Bob")
    .ToList();

原理说明

EF Core会自动将针对基类Animal的查询转换为对所有派生类对应表的UNION ALL查询,生成的SQL大致如下:

SELECT "a"."Id", "a"."Name", "a"."EducationLevel", NULL AS "FavoriteToy", 'Cat' AS "Discriminator"
FROM "Cats" AS "a"
WHERE "a"."Name" = 'Bob'
UNION ALL
SELECT "b"."Id", "b"."Name", NULL AS "EducationLevel", "b"."FavoriteToy", 'Dog' AS "Discriminator"
FROM "Dogs" AS "b"
WHERE "b"."Name" = 'Bob'

查询结果会自动实例化为对应的Cat或Dog对象,你可以通过类型判断(比如is Cat或is Dog)来处理不同派生类的特有属性。

内容的提问来源于stack exchange,提问作者Snail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:23:09