2012-03-23 45 views
0

是否有可能在實體框架做一個自定義的轉換器的方法,通過顯式轉換爲整數轉換成實體?從整數到實體的顯式轉換?

我做了這方面的一些研究,我不知道從哪裏開始。

這裏是什麼,我試圖做一個例子。

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? – 2012-03-23 23:38:06

+0

模型優先設計:) – 2012-03-23 23:38:54

+0

是不是隻是一個導航屬性? – 2012-03-23 23:40:42

回答

0

我終於做到了!根據Peter的建議(請參閱他對我的問題的評論),我已經在「int」上創建了一個擴展方法,它允許我執行我正在查找的操作。

我很自豪這個算法,因爲我想通了大部分自己。它涉及一些嚴肅的反思內容,動態創建lambda表達式,並對它們進行評估。但它的作品!

任何建議,以使其更短或更好,將不勝感激。

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

恭喜!我仍然想知道爲什麼只從上下文中的集合中通過Id檢索實體並不適合你。你必須指定類型,所以你已經知道你正在尋找一個'老師'ID 38。那麼爲什麼不''context.Teachers.FirstOrDefault()'?是的,它比38.ToEntity ()長,但可能快得多(沒有反射,動態),並且清晰如日光。另外,你需要ModelContainer.Instance,所以你被困在一個上下文生命週期模型中。 – 2012-03-25 18:55:19