2012-09-24 11 views
5

私は最初にEF4を使用しています。そのため、私のモデルクラスには、パブリックプロパティ、いくつかの仮想プロパティ(他のテーブルからのレイジーロードデータ用)、および[NotMapped]属性が付加されたいくつかのプロパティがあり、EFによってスキップされます。属性を考慮したEntity Frameworkの生のクエリを取得

ときどきロークエリを使用して、c.Database.SqlQuery<T>("select ...")を使用してEFを行マッパーとして使用することがあります。

「Intellitrace」では、これらのクエリが「IndexOutOfRange」に対して多くのスローされ捕捉された例外を生成していることに気付きました。見た後、例外はモデルオブジェクトの仮想と[NotMapped]プロパティのすべてです。私は、テーブルのプロパティだけで新しいデータモデルクラスまたは親クラスを構築する必要はありません。いくつかの設定ステップがありますが、未処理のクエリランナーの行マッパーにEFの残りの部分と同じ注釈に注意を払うように指示していますか?多分EF5でこれを修正したでしょうか?

答えて

1

dbContext.Database.SqlQueryを実行すると、EFは決してマッピングを使用しません。結果セットのプロパティ名と列の単純一致を使用します。代わりにdbSet.SqlQueryを使用してください。それは、データを添付エンティティとしてロードできるため、マッピングを反映する必要があります。

+0

私はdbSetが動作していることを知っていました。さまざまな理由から、私はDatabaseSetqlQueryの使用に興味があるdbSetを持っていません。だから、答えは「決してない」のように聞こえる。 – Mikeb

+0

はい、これらの2つの呼び出しには大きな違いがありますが、 'DbSet'を使用しない理由はありません。コンテキストがあり、型を知っているので、 'dbContext.Set ().SqlQuery(....)を呼び出すことができるはずです。 –

+0

それが速かったかどうかを見てみようとしていたのですが、なぜそれをしなかったのかを思い出しました。「エンティティタイプ(T)は現在のコンテキストのモデルの一部ではありません。 – Mikeb