3

データベースに、ゲッターとセッターを使用してモデル クラスを作成したいテーブルがあります。プロジェクトのほとんどのタスクで、PetaPoco を使用しています。モデルを手動で作成しましたが、多くの列を持つテーブルはほとんどありません。

PetaPoco を使用してデータベースからモデルを作成する方法はありますか?

4

3 に答える 3

7

T4 テンプレートを使用することを強くお勧めします。これにより、プロセスが大幅に高速化され、機能が追加されます。

最も速い方法は、「パッケージ マネージャー コンソール」 ([ツール] > [ライブラリ パッケージ マネージャー] > [パッケージ マネージャー コンソール]) を開き、プロジェクトが [既定のプロジェクト] ドロップダウンで選択されていることを確認して、次を実行することです。

PM>install-package petapoco

これにより、「Models」というフォルダーと「Generated」というサブフォルダーが作成されます。「Generated」フォルダにある「Database.tt」ファイルを開き、情報を設定します。この設定については、 http://www.toptensoftware.com/petapoco/を参照してください。

T4 テンプレートを正常にセットアップすると、データベース内のすべてのオブジェクトを含む "Database.cs" というコード ファイルが生成されます。生成されるのは「部分クラス」です。ここで重要なのは、このファイル内のオブジェクトを変更してはならないということです。代わりに、同じ名前空間に新しい部分クラスを作成して、追加のロジックを実装できるようにします。既存のオブジェクトを移動/更新して、新しいセットアップを確認します。

もう 1 つのオプションは、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 + '}'

これが役立つことを願っています。

于 2012-04-17T20:20:08.327 に答える
5

PetaPoco には、これを行う T4 Visual Studio テンプレートがあります。それらをすべて生成したくない場合は、テンプレートを使用して、必要な結果の *.cs ファイルからそれらのクラスをコピーします。

テンプレートは、PetaPoco の GitHub コード リポジトリにあります。

プロジェクトにテンプレートを追加するには、次の 2 つの方法があります。

  1. ファイルを手動でコピーする
  2. パッケージ コンソールで NuGet を使用するか、Visual Studio パッケージ マネージャーを使用します。NuGet サイトの詳細

パッケージが存在しない場合 (CVS の一部)、ビルド前に自動ダウンロードするように設定できるため、2 番目のオプションをお勧めします。

于 2012-04-14T19:12:16.927 に答える
0

Visual Studio では、統合された Entity Framework の「Code first from database」機能を使用して、PetaPoco で使用する POCO クラスを生成できます。それらを生成し、DBContext や属性などの不要な EF ゴミをすべて削除するだけです。このようにして、T4 テンプレートをいじることなく、C# だけでなく VB.NET とそのすべての視覚的なクリックに対しても POCO を生成できます。

Project/Add New Item.../Data/ADO.NET Entity Data Model/Code first from database

于 2016-06-29T10:40:20.627 に答える