2012-04-13 101 views
3

我在我的數據庫中有一個表,我想用getter和setter創建一個模型類。對於我的項目中的大部分任務,我正在使用PetaPoco。我手動創建模型,但很少有表格有很多列。如何使用PetaPoco庫自動創建數據庫模型?

有什麼方法可以使用PetaPoco從數據庫創建模型?

+1

來自peta poco的t4模板無法做到這一點? – wiero 2012-04-13 09:58:42

回答

4

PetaPoco有T4 Visual Studio模板應該爲你做這個。如果您不想讓它們全部生成,只需使用該模板,然後從所需的* .cs文件中複製這些類。

您會在PetaPoco's GitHub code repo上找到模板。

模板添加到您的項目可以通過兩種方式來完成:

  1. 複製在包控制檯中使用的NuGet或使用Visual Studio程序包管理器將文件手動
  2. 。詳細信息on NuGet site

我會推薦第二個選項,因爲您可以在構建之前將它們設置爲自動下載時(CVS的一部分)。

+0

我使用了爲我生成DAL的Database.tt。從該列表中選擇哪一個用於創建表格類? – RKh 2012-04-17 07:22:59

+0

@RPK:你從那個list_中得到什麼意思?什麼名單?默認情況下,它應該生成數據庫類和模式類。據我所知。我自己編寫手動POCO,但通過快速瀏覽模板,應該生成表類並將其包含在生成的'Database.cs'文件中。 – 2012-04-17 07:45:53

+0

在列表中,我的意思是你給我的鏈接中顯示的.tt。我也手動編寫POCO,但我想用T4添加一個。哪個T4模板可以運行?它會干擾現有的POCO嗎? – RKh 2012-04-17 08:33:48

5

我強烈建議您使用T4模板,因爲它可以使流程更加快速以及添加其他功能。

的最快方法是打開「包管理器控制檯」(工具>庫包管理器>包管理器控制檯),請確保您的項目在「默認項目」選擇下拉菜單和運行:

PM>install-package petapoco 

這將創建一個名爲「Models」的文件夾和一個名爲「Generated」的子文件夾。在「生成」文件夾中,打開「Database.tt」文件並設置信息。有關設置的信息,請參閱http://www.toptensoftware.com/petapoco/

成功設置T4模板後,它將生成一個名爲「Database.cs」的代碼文件,其中包含數據庫中的所有對象。產生的是「部分班級」。這裏的關鍵是你不應該修改這個文件中的任何對象。相反,您將在相同的名稱空間中創建一個新的部分類,然後您可以實現更多的邏輯。移動/更新您的現有對象以確認新的設置。

另一種選擇是創建一些TSQL來生成一些代碼。這是一個非常粗糙的例子,我過去用它來爲我的PetaPoco表生成接口。

declare @script nvarchar(max); 
declare @table nvarchar(256); 

set @table = 'YourTableName' 

set @script = 'public interface I' + @table + '{' + char(10); 
SELECT 
    @script = @script + 
     CASE 
      WHEN st.Name IN ('int') AND c.is_nullable = 0 THEN 'int' 
      WHEN st.name in ('smallint') AND c.is_nullable = 0 THEN 'short' 
      WHEN st.name IN ('bigint') AND c.is_nullable = 0 THEN 'long' 
      WHEN st.name IN ('varchar','nvarchar','sysname') THEN 'string' 
      WHEN st.Name IN ('datetime') AND c.is_nullable = 0 THEN 'DateTime' 
      WHEN st.Name IN ('bit') AND c.is_nullable = 0 THEN 'bool' 
      WHEN st.Name IN ('decimal') AND c.is_nullable = 0 THEN 'decimal' 
      /* NULLABLE VALUES */ 
      WHEN st.Name IN ('int') AND c.is_nullable = 1 THEN 'int?' 
      WHEN st.name in ('smallint') AND c.is_nullable = 1 THEN 'short?' 
      WHEN st.name IN ('bigint') AND c.is_nullable = 1 THEN 'long?' 
      WHEN st.name IN ('varchar','nvarchar','sysname') AND c.is_nullable = 1 THEN 'string?' 
      WHEN st.Name IN ('datetime') AND c.is_nullable = 1 THEN 'DateTime?' 
      WHEN st.Name IN ('bit') AND c.is_nullable = 1 THEN 'bool?' 
      WHEN st.Name IN ('decimal') AND c.is_nullable = 1 THEN 'decimal?' 
      --WHEN st.name IN('sysname') AND c.is_nullable = 1 THEN 'string?'  
      ELSE 'UNKOWN-' + st.name 
     END 
    + ' ' + c.name + '{get;set;}' + char(10) 
FROM sys.tables t 
INNER JOIN sys.columns c 
ON t.object_id = c.object_id 
INNER JOIN sys.types st 
ON st.system_type_id = c.system_type_id 
WHERE t.name = @table 

print @script + '}' 

我希望這有助於。

+0

TSQL上的Thanx我可以問爲什麼在SQL中沒有FLOAT類型的實現,你忘了FLOAT還是有其他原因? – adopilot 2013-05-28 14:14:36

+0

很高興爲您提供幫助。這只是一個可以從數據庫中提取信息的方式的一個快速和骯髒的例子。你應該能夠在邏輯中添加另一個條件來實現這一點。 – anAgent 2013-05-28 16:01:14

0

在Visual Studio中,您可以使用集成的Entity Framework的「Code first from database」函數來生成POCO類,以便與PetaPoco一起使用。只需生成它們並刪除所有不必要的EF垃圾桶,如DBContext和屬性。通過這種方式,您不僅可以爲C#生成POCO,還可以爲VB.NET生成POCO及其全部可視化點擊,而不會與T4模板混淆。

項目/添加新項目... /數據/ ADO。NET實體數據模型/代碼首先來自數據庫