从具有实体框架TPH模式的DB访问基类查询中的扩展类的属性

时间:2014-05-14 13:36:59

标签: c# asp.net-mvc entity-framework

查询标题可能不是自我解释的。

我有一个带有Entity Framework 6的ASP.NET MVC5项目。我先使用代码,然后为实体实现了TPH模式。

有一个基本的Request实体(我删除了大多数字段,这只是一个例子)。

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();
在调试中,我可以通过基础访问每个请求的扩展类的属性。那么,有没有办法以某种方式获得一种类扩展所选实体并访问它的属性?

目前要构建所有请求的列表并使用数据填充一些viewmodel,我需要单独选择每种类型的请求并从这些单独的选择中填充全局列表。

1 个答案:

答案 0 :(得分:2)

您需要将基类型转换为其子类型并测试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;
   }
}