2012-03-23 13 views
0

Entity Frameworkでは、明示的な変換によって整数をエンティティに変換するカスタムコンバータメソッドを作成できますか?整数から実体への明示的な変換?

私はこれに関するいくつかの研究を行いましたが、どこから始めたらよいかわかりません。

ここに私がしようとしているものの例があります。

int activeTeacherId = 38; 
Teacher activeTeacher = (Teacher)activeTeacherId; 

編集1いくつかの簡単な調査の後、私は本当に汎用的かつ柔軟であるためにすべてを必要とする場合、私はおそらくEntityObjectで何かをする必要があることを考え出しました。しかし、私はどのようにわからない。

編集2自分の経験から、次のコードを作成することができました。しかし、明らかな理由から、私は静的コンテキストの中で "this"を得ることはできません。

変換されるオブジェクトの型を何らかの形で取得できれば(常にEntityObjectに変換されるわけではないので、PersonまたはTeacherに変換されることがあるため)、理論的には動作します。

public class EntityObject : System.Data.Objects.DataClasses.EntityObject 
{ 
    public static explicit operator EntityObject(int id) 
    { 
     var container = ModelContainer.Instance; 

     var thisType = this.GetType(); //this can't be done from a static context, so how do we retrieve the type that we are converting into? 
     var containerType = typeof (ModelContainer); 

     dynamic setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set"); 

     ObjectSet<dynamic> set = setProperty.GetValue(container); 

     return set.FirstOrDefault(o => o.Id == id); 
    } 
} 
+1

CoreFirstまたはModelFirstに対してやっていますか? –

+0

モデルファーストデザイン:) –

+0

これはちょうどナビゲーションプロパティですか? –

答えて

0

私はついにそれをしました!ピーターの提案(私の質問に対する彼のコメントを参照)に基づいて、私は私が探しているアクションを実行するための "int"の拡張メソッドを作成しました。

私はこのアルゴリズムの大部分を自分で分かっているので、私はこのアルゴリズムを非常に誇りに思っています。これには、いくつかの深刻な反映、ラムダ式の動的作成、およびそれらの評価が含まれます。しかし、それは動作します!

これを短くするかより良いものにするための提案があれば幸いです。

public static class EntityObjectExtensions 
{ 

    private static int Id; 

    public static T ToEntity<T>(this int id) where T : class 
    { 

     lock(typeof(ModelContainer)) 
     { 

      Id = id; 

      var container = ModelContainer.Instance; 

      var thisType = typeof (T); 
      while (thisType.BaseType != typeof (EntityObject)) 
      { 
       thisType = thisType.BaseType; 
      } 

      var setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set"); 

      dynamic set = setProperty.GetValue(container); 

      var firstOrDefaultMethod = 
       typeof (Enumerable).GetMethods().FirstOrDefault(m => m.Name == "FirstOrDefault" && m.GetParameters().Count() == 2); 
      var firstOrDefaultGenericMethod = firstOrDefaultMethod.MakeGenericMethod(thisType); 

      var lambda = typeof (Func<,>); 
      var genericLambda = lambda.MakeGenericType(thisType, typeof (bool)); 

      var lambdaParameter = (Func<T, bool>) Delegate.CreateDelegate(genericLambda, typeof(EntityObjectExtensions).GetMethod("Compare", BindingFlags.Static | BindingFlags.NonPublic)); 

      dynamic item = firstOrDefaultGenericMethod.Invoke(null, new object[] {set, lambdaParameter}); 

      return (T) item; 

     } 

    } 

    private static bool Compare(dynamic item) 
    { 

     lock (typeof(ModelContainer)) 
     { 

      return item.Id == Id; 

     } 
    } 

} 
+0

おめでとうございます!私はまだContext内のコレクションからIDでエンティティを取得するだけでは適切ではないのに、なぜか不思議です。型を指定しなければならないので、id 38で 'Teacher'を探していることを知っているはずです。だから、' context.Teachers.FirstOrDefault() 'をどうしたらいいのですか?はい、それは38.ToEntity ()よりも長くなっていますが、おそらくはかなり速く(リフレクションもダイナミックでもなく)、昼光としてはっきりしています。さらに、ModelContainer.Instanceが必要なので、コンテキストライフサイクルモデルに悩まされています。 –