实体框架版本6.0 Table-per-Type层次结构查询从派生类型检索字段

时间:2016-08-02 19:59:11

标签: entity-framework entity-framework-6

我正在使用EF Code First 6.0版构建招聘流程。我有以下(高度缩写)继承层次结构,它使用Table-per-Type实现:

[Table("Person")]
    public class Person
    {
        [Key]
        public int PersonId { get; set; }
        [StringLength(30)]
        public string FirstName { get; set; }
        [StringLength(30)]
        public string MiddleName { get; set; }
        [StringLength(30)]
        public string LastName { get; set; }
}

[Table("Applicants")]
    public class Applicant : Person
    {
        //Various Applicant properties
        [StringLength(256)]
        public string UserName { get; set; }
}

[Table("Employees")]
    public class Employee : Applicant
    {
        public DateTime HireDate { get; set; }
        [StringLength(20)]
        public string WorkPhone { get; set; }
        [StringLength(30)]
        public string JobTitle { get; set; }
//Various other Employee Properties
}

每当我在LINQPad中执行以下查询时:

Applicants.Where(x => x.UserName == "johndoe999")

查询返回与派生类Employee(HireDate,WorkPhone,JobTitle)关联的字段,这是我没想到的。当我要求的是申请人时,我显然希望它省略“员工”相关字段。 每当我实现与table-per-hierarchy相同的层次结构时,就不会发生这种情况。它应该给我与Table-per-type相同的行为,不应该吗?我还需要做些什么才能启用此行为吗?

我已经看过一些关于这个问题的引用,例如(Entity Framework Table Per Type Performance),但是这是来自' 11与更老版本的EF有关。

1 个答案:

答案 0 :(得分:0)

显然,即使在EF 6.1中也不支持此功能。我在codeplex上找到了以下工作项:

https://entityframework.codeplex.com/workitem/2332

这是一篇文章的链接,通过将Dapper ORM与实体框架混合来解释变通方法。根据作者的表现,性能急剧提升。

http://blog.falafel.com/how-to-improve-the-performance-of-tpt-inheritance-mapping-in-entity-framework/

以下是EF关于EF 7版本1.0的github页面的讨论,该页面实际上完全省略了TPT,但他们声明他们最终会将TPT放回到EF 7中。我只是略读了这篇文章,但它并不是明确他们是否会在将TPT添加到EF 7时解决TPT的性能问题,或者它是否与版本6.1中的相同。

我将使用Dapper ORM或者找到一种不同的方法来建模我的数据。