EntityFramework Code First和自定义继承

时间:2013-12-11 11:20:32

标签: linq entity-framework code-first dbcontext entity-framework-6

我们有一个使用经典ADO.NET技术成功运行的大型企业应用程序。我们正在尝试用EF 6来看看我们是否可以减少经典技术所需的一些管道(请不要回答任何这些的优点和缺点,我们已完成了我们的功课)。

我们决定使用EF Code First方法,因为它最适合我们现有的代码。我们坚持在EF模型类中表示特定的继承方案。

有一个名为Profiles的表,它有ProfileId(Identity)和ProfileNumber列。底层细节有点复杂,但尝试用简单的话来说,ProfileId是主键。 ProfileNumber可以是唯一的,也可以不是基于配置文件的类型。例如对于代理配置文件,ProfileNumber不能在“个人档案”表中重复。

现在有另一个名为AgentDetails的表,其中ProfileNumber作为Profiles表中的外键(AgentDetails表中没有ProfileId列)。请不要建议架构更改,这对我们所拥有的部署类型来说根本不可行。

现在我们在代码中创建了一个包含所有属性的Profile类。我们创建了另一个名为Agent的类,它派生自Profile。它具有AgentDetails表中除ProfileNumber之外的所有列的属性,因为它继承自Profile类。

我们正在尝试编写一个LINQ查询,该查询返回代理对象,其中还填充了所有Profile类派生属性。但是在尝试各种LINQ查询(有和没有显式连接)之后,似乎都没有成功。我们总是在ProfileId列上收到错误,表明LINQ查询的结果集不包含ProfileId列。

在这种情况下是否可以使用DbContext和DbSet以及Linq查询来编写LINQ表达式,该表达式将AgentDetails与ProfileNumber上的Profiles表连接,并返回一个代理对象List,其中还填充了基础Profile属性。

我们已尝试使用各种DataAnnotation属性(但尚未查看Fluent API)来完成此操作,但尚未成功。

请注意我们不会等待Agent对象包含Profile对象,我们希望它继承自Profile。 This blog post在数据库中明确定义关系时表现相同。在我们的例子中,在AgentDetails和Profiles表之间的数据库中没有定义外键关系。

当然,在这种情况下,一种方法是使用DataReader,并手动填充对象属性。我们试图看看是否有一种本地EF方法来完成这项工作,否则我们可能会考虑委托给好的旧数据读者。

更新:这是代码的骨架版本:

Table("Profiles")]
public class Profile
{
  public int ProfileId {get; set;}
  public string ProfileNumber {get;set;}
  public string FullName {get;set;}
}

Table("AgentDetails")]
public class Agent : Profile
{
  //Notice I omitted ProfileNumber column, that's present in AgentDetails in database, but inherited from Profile class here.
  public decimal CommissionPct {get;set;}
}

以下是一个示例查询:

//Basically trying to get a list of all agents
this.context.Agents.ToList();

我们得到的错误是:

  

无效的列ProfileId

1 个答案:

答案 0 :(得分:0)

首先,您是个人资料实体中的特定主键。 如果你在DbContext中设置DbSet For Agent,那很好并且工作正常。