2016-08-02 10 views
0

私はEFコードファーストバージョン6.0で採用プロセスを構築しています。私はLINQPadで次のクエリを実行するたびにEntity Frameworkバージョン6.0テーブル単位の階層型クエリは、派生型からフィールドを取得します

[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 
} 

:私は表あたりのタイプを使用して実装されています以下の(非常に略す)継承階層を持っている

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

クエリが関連付けられたフィールドを返します。私が期待していなかった派生クラスEmployee(HireDate、WorkPhone、JobTitle)。私は明らかに、「従業員」の関連分野を省略することを願っています。 これは、階層ごとのテーブルと同じ階層を実装したときには発生しません。それは私にテーブル当たりの同じ動作を与える必要があります、それはしないでください?この動作を有効にするために何か他に必要なことはありますか?

は、しかし私は、これは、EFのかなり古いバージョンに関連した'11からであるように(Entity Framework Table Per Type Performance)として、この問題にはいくつかの言及を見てきました。

+0

あなたが '応募者 'を取得した場合、あなたは必ず*従業員も取得します。型のプロパティを反映するコンポーネントは 'Employee'プロパティを表示します。私はあなたがタイプを並べて継承していない限り、それがTPHで起こらなかったとは想像できません。 –

答えて

0

明らかに、これはEF 6.1の場合でもサポートされていません。ここで

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

Entity FrameworkのでDapperのORMを混合することにより回避策を説明する記事へのリンクです:私は、CodePlexの上で、次の作業項目を見つけました。著者のパフォーマンスに応じて劇的に増加します。ここで

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

は、実際には完全にTPTを省略したが、彼らは最終的に戻ってEF 7.私はちょうど記事を脱脂にTPTを置く状態EF 7バージョン1.0に関するEFのgithubのページでの議論ですが、そうではありませんTPTをEF 7に追加するときのTPTのパフォーマンスの問題に対処するか、バージョン6.1と同じように動作するかどうかを明確にしてください。

Dapper ORMを使用するか、データをモデリングするために別の方法を使用します。

関連する問題