我们有一个使用经典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
答案 0 :(得分:0)
首先,您是个人资料实体中的特定主键。 如果你在DbContext中设置DbSet For Agent,那很好并且工作正常。