2009-06-21 16 views
3

エンティティをそのストアタイプ(テーブルまたはビューのいずれか)に基づいてフィルタリングしようとしています。エンティティセットのストアタイプを取得する方法

私のテストプロジェクトには2つのエンティティがあり、ソースはテーブルで、もう1つのソースはビューです。

<EntitySet Name="Test" EntityType="TestModel.Store.Test" store:Type="Tables" Schema="dbo" /> 
<EntitySet Name="TestView" EntityType="TestModel.Store.TestView" store:Type="Views" store:Schema="dbo" store:Name="TestView"> 

上記モデルのEDMXファイルのSSDL部から採取されたサンプルコード。

店舗:タイプ SSDLの情報が必要ですが、エンティティフレームワークAPIを使用してその値を取得する方法が見つかりませんでした。

ご協力いただければ幸いです。

答えて

2

SSpaceまたはStoreItemCollectionを調べることで、SSDLのメタデータをクエリできます。

すなわち

var sspaceEntitySets = context.MetadataWorkspace 
         .GetItems<EntityContainer>(DataSpace.SSpace) 
         .First().BaseEntitySets.OfType<EntitySet>(); 
var entitySet = sspaceEntitySets.First(); 
var tableType = entitySet 
.MetadataProperties["http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type"] 
.Value.ToString(); 

残念ながら、これはあなたが彼らがテーブルまたはビューから来るかどうかに、あなたのクラスを結びつける手助けするつもりはありません。エンティティ(つまりCSpaceでコード化したエンティティ)は、テーブルの形状(つまりSSpaceのもの)を記述するエンティティではなくCSpaceにあり、エンティティがビューまたはテーブルから来るかどうかを知るためには、マッピングを介してCSpace EntitySetからSSpace EntitySetに到達することができます。

残念ながら、EFはパブリックCSSPaceを公開しません(つまり、EDMXのMSLフラグメントを読み取るAPIを使用する方法はありません)。

これを行うには、おそらくLINQ to XMLなどを使用してMSL要素を手動で判断する必要があります。 。

希望これは

アレックス

+0

VAR sspaceEntitySets = context.MetadataWorkspace .GetItems (DataSpace.SSpace) 1次回()BaseEntitySets.OfType ()ことができます。 この行は、 "スペース 'SSpace'に関連付けられたコレクションがないというInvalidOperation例外をスローします。 – Cankut

+0

ありがとうアレックス、SSDLが必要になるまでロードされていないので、私は上記のエラーがあります。小さな "ToTraceString()"が問題を解決しました。 http://thedatafarm.com/blog/data-access/quick-trick-forcing-metadataworkspace-itemcollections-to-load/ – Cankut

+0

EF 4.1はCSSpaceをAPIに導入しますか?ユースケースは、予期しないSQL例外をより有益なエンティティエラーのdescirptionsに変換しようとしています。たとえば、 "NULLをカラム 'fstnam'に挿入できません。テーブル 'ppl'"を "名前としてNULLを使用できません" –

関連する問題