2010-12-08 11 views
7

edmxで生成されたEntity Frameworkからスキーマ情報を取得する方法を知っている人はいますか?エンティティフレームワーク4でプログラマティブに外部キーのメタデータを読み取る

具体的には、私が現在インスタンスを持っていないエンティティの外部キーをトラバースして外部キーの関係を取得したいと思っています。毎回カスタムコードなしで任意のエンティティクラスに一般的に適用されます。

EG:私のスキーマには2つのクラスUserとGroupがあります。私は "User"エンティティの "GroupId"プロパティから得た "42"という数字を持っていますが、現時点では "User"のこの "GroupId"プロパティがどのようにその "GroupId"プロパティによって "Group"エンティティになります。

答えて

7

解決策を見つけました。関連情報は、コンテキストのRelationshipManagerプロパティにあります。 GetAllRelatedEnds()を呼び出し、タイプAssociationSetのものを見つけることによって。次に、設定関連の

ElementType

IsForeignKey性ともToRoleToPropertyFromRoleFromPropertyそれぞれ制約の特性を有するアレイReferentialConstraints、及びToRole/FromRoleRelationshipMultiplicityが方向を決定するために用いることができるが含まれてい外部キー関係の

このデータをすべて取り、コンテキストのGetObjectByKeyメソッドを使用すると、コンテキストに定義されている外部キーの関係をプログラマチックにトラバースすることができました。

+1

私はこの仕事を得ることができませんでした。私はコンテキストでRelationshipManagerプロパティを見つけることができませんでしたが(CType(tableObject、IEntityWithRelationships).RelationshipManagerで取得できますが)、その後、GetRelatedEndsからAssociationSetにキャストできる結果が見つかりませんでした。コード例を深く感謝します。 – pbarranis

+1

遅い応答のおかげで、私はこれを長い間読んでいなかった。私はContextから直接ではなく、ObjectStateEntryから作業していたことをより明確にすべきでした。私がそこから使用した正確な構文は "foreach(AssociationSet assoc in ose.RelationshipManager.GetAllRelatedEnds()。Select(end => end.RelationshipSet).Where(rs => rsはAssociationSet &&(AssociationSet)rs).ElementTypeです。 IsForeignKey).Cast ()) "、私は外部キーの特定の多重度が欲しかったので、それがどちら側であったかを調べるためにいくつかの追加のロジックを持っていました。 – fyjham

21

次のアプローチを使用することができます -

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) 
foreach (var entityMember in entity.NavigationProperties) 
foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties()) 
{ 
    //... use foreignKey 
} 
+2

優秀 - ありがとう!私はポスターの答えをどうやって取得するのか分かりませんが、あなたの仕事は初めてでした。コード例でもA +! – pbarranis

+2

よかった。 Google上でこのような関連情報を見つけることは非常に難しいため、 –

+0

同じです。ありがとうございました! –

関連する問題