c# - 没有鉴别器的摘要/详细实体
问题描述
我想要一个可以使用摘要实体或详细实体检索数据的表。所有数据都将使用详细实体添加,但通常我只需要每个记录的摘要来构建列表,并且不需要为此加载一些较大的字段以提高速度。我已经尝试了下面的代码,但它添加了一个我不想要的鉴别器。我怎样才能正确地做到这一点?理想情况下,它会阻止在摘要中添加记录,但我对此并不担心。
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");
});
}
}
解决方案
我认为你正在寻找的是每个层次结构的表:
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
因此您不会查询所有数据。
推荐阅读
- c - 开放函数中模式位的含义是什么?
- facebook - 使用 Facebook 共享调试器获取网站会导致错误
- docker - docker run -p 3000:3000 d9a82c31eab5 not working
- python - 使用单独的线程创建对象
- select - 启用多选时如何从 svelte-select 组件中获取所有值
- swift - 如何使用 Core NFC 和 Swift UI 连接异步数据获取?
- c# - C#根据彩色图像创建渐变
- python - 使用 VSCode 的 OpenCV for python 运行停止在 'cv2.VideoCapture(0)' 但没有给出错误
- macos - 如何在 VS Code 的终端中重新绑定键盘快捷键?
- node.js - 是否可以在 Express ReactJS 应用程序中同时使用 res.sendFile() 和 res.redirect() ?