2

私はentityframework 6 Code-Firstを使用して作業している既存のデータベースを持っています。ただし、データベースでのすべての作業は、ストアド プロシージャを介して行う必要があるという要件があります。そこで、6.0 で新しくなったマッピングを使い始めました。

modelBuilder.Entity<Post>().MapToStoredProcedures();

問題は、これは選択されたspではなく、挿入、更新、および削除のspのマッピングのみをサポートすることです。選択するspを使用できるようにする必要があります。(既存の SP を編集する権限がありません)

私のpocoには、列属性を使用して使用する列名を指定する属性があります。どうやら、組み込みのマッピングは、dbset オブジェクトを介してテーブルを直接選択しない限り、それらの使用をサポートしていません。

もともと私は(うまくいきました):

return (from c in DataContext.Current.AgeRanges orderby c.StartAge select c);

次に、試した sp に切り替えます (データベースの sqlquery 呼び出しを使用):

return DataContext.Current.Database.SqlQuery<AgeRange>("[DIV].[GetAgeRangesList]").AsQueryable();

これにより有効なオブジェクトが返されましたが、Column 属性でマークされた列には何も含まれていませんでした。

次に、試してみました(列マッピングを取得する実際のdbsetオブジェクトに反対していたので考えました):

return DataContext.Current.AgeRanges.SqlQuery("[DIV].[GetAgeRangesList]").ToList().AsQueryable();

いいえ、代わりに、返されたレコードセットに POCO オブジェクトのプロパティの 1 つ (Column 属性の 1 つ) が見つからないというエラーが表示されました。

問題は、エンティティ フレームワーク (またはそれ以外の最適なソリューション) で、ストアド プロシージャを呼び出して結果をオブジェクトにマップし、そのマッピングがプロパティの列属性を尊重するようにする最善の方法は何ですか?

Column 属性を尊重するオブジェクトをすばやく簡単にマップする方法があれば、古い学校の Table オブジェクトと SqlCommand オブジェクトを使用してそれを埋めることもできます。

4

1 に答える 1

3

SqlQuery は Column 属性を尊重しません。返された結果セットの列の名前がエンティティのプロパティの名前と一致する場合、それに応じてプロパティを設定する必要があります。ただし、SqlQuery は最小限の作業しか行わないことに注意してください (たとえば、リレーションシップ (.Include) をサポートしていません)。そのため、クエリにストアド プロシージャを使用することにした場合は制限されます。ColumnName 属性を使用するように SqlQuery を強化することは、https ://entityframework.codeplex.com/workitem/233 で追跡されています- この codeplex アイテムに賛成票を投じてください。

于 2013-12-17T05:23:28.353 に答える