エンティティセットのストアタイプを取得する方法
-
06-07-2019 - |
質問
ストアタイプ(テーブルまたはビュー)に基づいてエンティティをフィルタリングしようとしています。
テストプロジェクトに2つのエンティティがあり、一方のソースはテーブルで、もう一方のソースはビューです。
<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の store:Type 情報は必要だと思いますが、エンティティフレームワークAPIを使用してその値を取得する方法が見つかりませんでした。
ご協力いただければ幸いです。
解決
SSpaceまたはStoreItemCollectionを調べることで、SSDLのメタデータを照会できます。
i.e。
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();
残念ながら、これはクラスをテーブルまたはビューのどちらから取得するかと結び付けるのに役立ちません。テーブルの形状を記述するエンティティ(つまり、SSpaceのもの)ではなく、エンティティ(つまり、CSpaceでコーディングするもの)がCSpaceにあり、エンティティがビューまたはテーブルから来ているかどうかを知るために必要です。マッピングを介してCSpace EntitySetからSSpace EntitySetに取得できるようにします。
残念ながら、EFはパブリックCSSPaceを公開していません(つまり、APIを使用してEDMXのMSLフラグメントを読み取る方法はありません)。
これを行うには、おそらくLINQ to XMLなどを使用して、MSL要素を手動で推論する必要があります。
これが役立つことを願って
アレックス
所属していません StackOverflow