使用实体框架TPH模式访问数据库中基类查询中扩展类的属性

本文关键字:查询 基类 扩展 属性 数据库 实体 框架 TPH 访问 模式 | 更新日期: 2023-09-27 18:03:14

问题的标题可能不是不言自明的。

我有ASP。. NET MVC5项目与实体框架我首先使用代码,并为实体实现了TPH模式。

有一个基本的请求实体(我已经删除了大部分字段,这只是一个例子)。

public class Request
    {
        public int Id { get; set; }
        public string Title { get; set; }
    }

也有一些模型有专属属性来扩展它:

public class RequestQuestion : Request
    {
        public string Question { get; set; }
        public string Answer { get; set; }
    }
public class RequestForWork : Request
    {
        public string WorkName { get; set; }
    }

每一个都被添加到EntityContext:

public DbSet<Request> Requests { get; set; }
public DbSet<RequestQuestion> RequestQuestions { get; set; }
public DbSet<RequestForWork> RequestForWorks { get; set; }

当我创建一些请求时,我像这样添加它们:

var db = new EntityContext();
var requestQuestion = new RequestQuestion{ some initialization };
this.db.Requests.Add(requestQuestion);
this.db.SaveChanges();

问题来了。当我查询用户

的请求时
var requests = this.db.Students.Find(userId).Requests.ToList();

在调试中,我可以通过基类访问每个请求的扩展类的属性。有没有一种方法能让类的类型扩展选定的实体并访问它的属性?

当前要构建所有请求的列表并填充一些视图模型的数据,我需要分别选择每种类型的请求,并从这些单独的选择中填充一个全局列表。

使用实体框架TPH模式访问数据库中基类查询中扩展类的属性

您需要将基类型强制转换为它的子类型并测试null

foreach (r in requests)
{
   var rq = r as RequestQuestion;
   if(rq != null)
   {
      string rq = rq.Question
   }
   var rfw = r as RequestForWork;
   if(rfw != null)
   {
      string wn = rfw.WorkName;
   }
}