首页 > 解决方案 > 没有鉴别器的摘要/详细实体

问题描述

我想要一个可以使用摘要实体或详细实体检索数据的表。所有数据都将使用详细实体添加,但通常我只需要每个记录的摘要来构建列表,并且不需要为此加载一些较大的字段以提高速度。我已经尝试了下面的代码,但它添加了一个我不想要的鉴别器。我怎样才能正确地做到这一点?理想情况下,它会阻止在摘要中添加记录,但我对此并不担心。

public class Summary
{
    public Guid Id { get; set; }

    [StringLength(254)]
    public string Name { get; set; } = string.Empty;
}

public class Detailed : Summary 
{
    public string BigField { get; set; } = string.Empty;
}

public class MyDbContext : DbContext
{
    public DbSet<Summary> Summaries { get; set; } = null!;
    public DbSet<Detailed> Details { get; set; } = null!;

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Summary>(
            s =>
            {
                s.ToTable("Details");
            });

        modelBuilder.Entity<Detailed>(
            s =>
            {
                s.ToTable("Details");
            });
    }
}

标签: c#entity-framework-core

解决方案


我认为你正在寻找的是每个层次结构的表:

https://docs.microsoft.com/en-us/ef/core/modeling/inheritance#table-per-type-configuration

另一种解决方案是将添加Detailed到数据库中,并且只在查询中选择所需的字段

dbContext
    .Details
    .Select(d => new Summary { Id = d.Id, Name = d.Name })
    .ToListAsync();

这被翻译成 sql 查询:

SELECT Id, Name
From Detailed

因此您不会查询所有数据。


推荐阅读