2015-12-24 20 views
8

余分な部分クラスを使用してEF自動生成クラスに追加のプロパティを追加すると、データベースに対してクエリを実行するときにこれらのプロパティが設定されたり埋められません。Entity Frameworkの余分なプロパティがDbContext.Database.SqlQueryによって生成されない

例:

自動生成クラスPerson:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 

と使用:

public partial class Person 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

私自身の部分クラス

public partial class Person 
{ 
    public string DisplayName{ get; set; } 
} 

私は次のクエリを作ります

DbContext.Database.SqlQuery(typePerson, SQL, null) 

Id、FirstNameおよびLastNameにはDisplayNameは設定されません。

しかし、私はMyPerson

public partial class MyPerson 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName{ get; set; } 
} 

と呼ばれる全く新しいクラスを作成し、DisplayNameにも同様に移入されMyPersonの種類で同じクエリを実行します。

私はこの問題を解決する方法を教えてもらえますか。誰かが新しいクラス/タイプを作成するのではなく、部分的に使うことができます。

ダウンロード例:https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

UPDATE 2015年12月28日: 他のStackOverflowとCodeProjectのフォーラムを通じて読みながら、私はそれが仕事を得るために別の方法を見つけました:

1)Typebuilderを使用して( http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery)しかし、すべての種類のプロジェクトの依存関係のために、私はすでに作成された型を見つけてメモリを吹き飛ばすのに問題がありました。

2)これまでのベストオプション:継承を使用する。

私はこの線で別のクラスを作成する場合:

class Person_Reflect : Person { } 

私は、次のコードを使用することができます(それはEDMXファイルと使用反射のマッピングを無視します:

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
+3

です:

class Person_Reflect : Person { } 

は、私は次のコードを使用することができます(それはEDMXファイルと使用反射のマッピングを無視します) 'Person'の2番目の部分クラスが正しい名前空間にあることを確認してください。 –

+0

モデルを変更したので例外はありません。 – dotctor

+0

DisplayNameは値のないプロパティとして表示されますか? –

答えて

0

トライ削除*

@" 
SELECT 
    Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
FROM [Person]" 

また、これはコードです...そして、多くのコードし、またはデータベースの変更は、継承を使用することで発生したときに多くのコードレビューを行うことなく、これまでの自分の生のSQLに

public string DisplayName { get { return FirstName+ " " +LastName ; } } 
+0

*を残しても機能しない場合は、さらに悪化します。 1つの列を忘れた場合、アプリケーションは終了します: データリーダーが指定された「Application.Person」と互換性がありません。タイプ 'COLUMNNAME'のメンバーには、データ・リーダー内に同じ名前の対応する列がありません。 あなたのコーディングソリューションはこの例を解決しますが、結果を表示/書式設定する方法のエンドユーザーの選択肢を多数作成するために実行時に充実した動的クエリがあります。ですから、私はビューオプションしか持っていません。つまり、エバールや動的クエリを作成するだけです。 –

+0

それは動作するはずです...列は同じCASEとデータ型でなければなりません。私は何かsimular自分自身を行ったので、私はそれが動作することを知っている..ダブルチェックケースとタイプ – Seabizkit

+0

親愛なるSeabizkit。私は、あなたが達成したことをうまく動作させることができないような試練の例をアップロードしました。完全な例へのリンクは次のとおりです。https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0 –

1

ベストオプションをそれを含める必要があります。

私はちょうどこのラインで別のクラスを作成する場合:あなたは

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
関連する問題