2012-02-15 17 views
0

dbからエンティティを取得するときに「親プロパティ」を動的に使用しています。ただし、プロパティが値型(または文字列)か何かのienumerable(それらを除く)であるかどうかをチェックするので、複合型として定義されたエンティティも含みます。これにより例外が発生します。Entity Framework 4.3 POCO複合型に例外がスローされる例外

エンティティが複合型として定義されているかどうかを確認できますか?

public IEnumerable<object> LookupExtent(Type type) 
{ 
     var set = Set(type); 

     DbQuery q = null; 

     foreach (var prop in type.GetParentProperties()) 
     { 
      if (q == null) 
       q = set.Include(prop.Name); 
      else 
       q = q.Include(prop.Name); 
     } 

     return q.ToObjectArray(); 
    } 

PS:

このサンプルコードを参照してくださいはい、私は親の性質を持っていない場合、これは失敗します知っている...

答えて

1

それがはるかに問題を抱えています。あなたのエンティティにマップされていないいくつかのプロパティがさらに含まれているとどうなりますか? EFに、マップされたすべてのナビゲーションプロパティの名前を入力するように指示することができます。 EFメタデータから情報を得ることはほとんど科学的ではありませんが、可能です。 (コードを使用すると、DbContext APIを使用していることを期待していますが、それは簡単にObjectContextをAPIに変更することができます)このようなものを試してみてください:

ObjectContext objectContext = ((IObjectContextAdapter) dbContext).ObjectContext; 
MetadataWorkspace workspace = objectContext.MetadataWorkspace; 
EntityContainer container = 
    workspace.GetEntityContainer("NameOfYourContextClass", true, DataSpace.CSpace); 
EntitySet entitySet = 
    container.GetEntitySetByName("NameOfYourPropertyExposingDbSetOnTheContext", true); 
IEnumerable<string> navigationPropertyNames = 
    entitySet.ElementType.NavigationProperties.Select(n => n.ToString()); 

キーがGetEntityContainerGetEntitySetByNameに正しい名前を提供している、それはまたの主な違いですまずコードを作成し、db/modelを最初に作成します。コードを最初に使用している場合、これらの名前はいくつかの規則に従います。 EDMXを使用している場合は、デザイナでこれらの名前を制御できます。

とにかくこのオートマティックは、使用しないでください。本当に必要なデータのみを含め、常にcomplexity of the queryを表示するように明示的に行います。

+0

私はあなたの懸念を理解しており、私が達成しようとしているのは「デフォルトの使用例」ではありません。非常に特殊な場合にのみこのオートマティックを使用します。デフォルトのケースには、親または子のプロパティは含まれておらず、それらのロードは明示的に述べられなければなりません。私はあなたのコードを試して、私はオフィス(次の月曜日)に戻ってくるので答えをあなたにマークしますので、あなたはちょっと待ってください;-) – UrbanEsc

関連する問題