MongoDB EF Core中如何让Pod单独存储,其余继承类使用TPH映射
解决MongoDB.EntityFrameworkCore中Pod单独集合存储的问题
要实现Planet、Asteroid用TPH存储在SpaceObjects集合,Pod单独存储在Pods集合,你需要调整DbContext的配置和DbSet声明,具体步骤如下:
1. 在DbContext中添加Pod的DbSet
仅声明DbSet<SpaceObject>会让EF Core默认将所有子类纳入TPH规则,必须单独声明Pod的DbSet来触发单独集合的配置:
public class YourDbContext : DbContext { public DbSet<SpaceObject> SpaceObjects { get; set; } public DbSet<Pod> Pods { get; set; } // 新增这一行 // 其他配置(比如OnConfiguring) }
2. 调整OnModelCreating配置
显式配置父类的TPH范围(排除Pod),同时指定Pod的目标集合:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置SpaceObject的TPH,仅包含Planet和Asteroid modelBuilder.Entity<SpaceObject>() .HasDiscriminator<string>("_t") // 显式指定默认鉴别器字段,可选 .HasValue<Planet>("Planet") .HasValue<Asteroid>("Asteroid"); // 指定Pod单独存储到Pods集合 modelBuilder.Entity<Pod>().ToCollection("Pods"); }
3. 移除冲突特性(可选)
如果之前给Pod类加了[Collection("Pods")]特性,建议移除,避免与Fluent API配置冲突,统一用代码配置更清晰。
原理说明
MongoDB EF Core中,子类的集合归属由DbSet声明和模型配置共同决定:
- 当子类未单独声明DbSet时,会默认继承父类的TPH规则,即使配置了
ToCollection也会被忽略。 - 单独声明子类DbSet后,Fluent API的
ToCollection配置才会生效,将该子类从父类的TPH层次中分离,单独存储到指定集合。
内容的提问来源于stack exchange,提问作者Troopers
相关产品推荐
相关产品推荐

