簡體   English   中英

如何從實體框架的模型元數據中獲取樹結構

[英]How to get a tree structure from Entity Framework's model metadata

我正在開發一個動態報告生成器,它允許最終用戶使用Entity Framework模型基本上創建自己的SELECT語句。 讓我先描述一下我要實現的目標:

  1. 用戶選擇一個實體(例如“學生”),
  2. 他得到一個列表,其中包含實體屬性(“ FirstName”,“ LastName”等,以及它們的類型)和相關實體(“ Enrollments”)。 不包含主鍵和外鍵屬性,
  3. 在此列表上,相關實體就像目錄,用戶可以單擊它們以樹狀結構顯示其屬性和相關實體,
  4. 用戶可以選擇任何屬性(稍后將需要創建動態SELECT語句)。

我當時正在考慮使用反射來執行此操作,這似乎是一種相對簡單的方法,但存在局限性(例如確定屬性是否為外鍵)。 我知道也有MetadataWorkspace類,但這對我來說很混亂,以前從未使用過。 我還需要提及的是,我知道潛在的參考循環,因此相關實體會有深度限制。 如何創建這樣的實體關系樹?

附加信息

我忘了提一下,我正在做的這個項目將是一個可重用的庫,因此它應該與任何dbContext一起使用,最好(如果可能)與dbContext一起使用,而無需修改模型或添加屬性。

有關您的開發的一些准則:

  • 下面的方法可以提取模型的所有類屬性:

     public static IEnumerable<PropertyInfo> ExtractTypeProperties(Type type) { return type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); } 
  • 導航屬性通常是virtual 您可以使用如下所示的屬性來獲取這些屬性:

     foreach (var property in typeof(MyModel).GetProperties().Where(p => p.GetGetMethod().IsVirtual)) { ... } 
  • 模型主鍵通常具有名稱IdTheModelId或用[Key]裝飾;

  • 模型外鍵通常具有相同名稱的關聯導航屬性,但Id后綴除外,或者使用[ForeignKey]裝飾。 請注意,導航屬性也可以使用此屬性進行修飾,因此我認為您必須進行仔細檢查才能滿足所有約定。
  • 避免從EF自身反映所選對象,因為EF會用動態代理替換導航屬性。 優先反映類的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM