2011-04-29 48 views
1

我不太瞭解ORM工具的工作原理,但是從與Entity Framework(EF)的合作中,我知道可以通過某種方式從存儲在數據庫中的任意視圖中自動生成CLR類。在EF中,這些類是從您的實體模型自動生成的。 EF甚至可以從存儲過程獲取列信息,並根據此信息生成新的「複雜類型」。將單個任意SQL SELECT語句映射到單個類的O/R映射?

  • 它怎麼可能自動生成.NET類,只使用(1)SQL SELECT語句提供的信息和(2)查詢數據庫的元數據的能力?

由於SQL存儲在數據庫中,因此我們知道在編譯時SELECT SQL是什麼。同樣,實體框架知道在編譯時View或存儲過程的SELECT SQL是什麼。我們希望通過了解SELECT SQL和查詢數據庫的元數據來自動生成.NET類。我需要能夠將生成的單個DataTable轉換爲自動生成的類。

看來我的問題的答案在於瞭解ORM工具;

  • 有ORM工具,在那裏,已經可以做什麼,我需要,或
  • 你能解釋如何實體框架從視圖和存儲過程自動生成的.NET類?
  • 或者,如果您可以想出另一種解決方案來爲我的場景自動生成類,那也將不勝感激。

如果需要澄清,請告訴我。

+0

[獲取從存儲過程返回的列名/類型]的可能重複(http://stackoverflow.com/questions/3747879/get-column-names-types-types-returned-from-a-stored-procedure) – NotMe 2011-04-29 15:34:36

回答

-1

我想出瞭如何做到這一點。我爲這個here寫了一個非常基本的解決方案。

+0

鏈接已死,信息應直接回答。 – CrazyPyro 2013-08-29 16:06:49

1

關於表和視圖的元數據數據加載系統視圖:sys.tablessys.viewssys.columnsothers

編輯:

我只是測試EF如何得到列名和類型,它確實執行存儲過程,並在返回的列進行迭代。它只使用一些複雜的查詢來正確構建調用命令並處理返回值。

+0

單擊「獲取列信息」(順便說一下,EF如何從存儲過程獲取此列信息?),單擊「創建複雜類型」,然後實體框架自動生成新的複雜類型類。它在designer.cs文件中 – 2011-04-29 15:16:46

+0

是的,我修改了我的答案。 – 2011-04-29 15:17:27

+0

是的,早些時候我在運行SQL Server分析器時發現了這一點。我現在正在爲這個問題建立一個解決方案,並不是那麼困難。它將使用這些信息和T4文本模板來生成我需要的類。 – 2011-05-01 17:09:52

0

如果您使用System.Data.SqlClient命名空間,實際上並不需要ORM來執行此操作。這裏有一個快速和骯髒的例子,適用於隨機查詢語句:

public static List<string> GetColumns(string connectionString, string queryString) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlDataAdapter adapter = new SqlDataAdapter(); 
     adapter.SelectCommand = new SqlCommand(queryString, connection); 

     connection.Open(); 
     List<string> columnNames = new List<string>(); 
     SqlDataReader reader = adapter.SelectCommand.ExecuteReader(); 
     for (int xx = 0; xx < reader.FieldCount; xx++) 
     { 
      columnNames.Add(reader.GetName(xx)); 
     } 
     return columnNames; 
    } 
} 

這不會幫助您自動生成類本身。儘管如此,它仍然是拉取您需要的數據的起點。