2009-06-15 10 views
8

したがって、初心者のNHibernateユーザ。私の脳をその周りに包み込むことを試みている。NHibernateはdbスキーマが生成されているかどうかを確認できますか?

私は、Webアプリケーションへのアドオンのデプロイメントと後での注入(独自の永続性クラスが必要な場合があります)を処理する方法を検討しています。

デプロイメントにSchemaExportを使用するとかなりうまくいくと思っていましたが、NHibernateにスキーマのエクスポートが既に行われているという共通のコードベースの方法を教えてもらえないかと思いました。ない。基本的に、私はこの擬似コードのようsmethingをしたい:2つの関数は、それぞれ内部SchemaExportまたはSchemaUpdate、使用する

if(!_cfg.HasSchemaForType(typeof(MyType)) 
     ExportSchema(typeof(MyType)); 
    else 
     UpdateSchema(typeof(MyType)); 


編集:皆さん、私はこれまでの回答に感謝しますが、ポイントを少し欠いています。私がセットアップしようとしているのは、アプリケーションがdbの変更を必要とするアドオンの追加と削除を許可する方法です。私は自分のコードなどのバージョン管理について話しているわけではありません(少なくとも、その主要な機能ではありません)。ですから、アプリケーションをデプロイする時期は少なく、プラグインを追加したり削除したりするときには問題はありません。 theisプラグイン(したがって擬似コードタイプのチェック)は以前にデプロイされていますか?更新されている場合は、更新プログラムを実行します。そうでない場合は、エクスポートを実行します。理にかなっている?

答えて

3

いいえ、NHibernateはあなたが求めていることをしません。私は、スキーマをエクスポートしてデータベーススキーマと比較したコードを書くことができると思います。しかし、おそらくテンポラリ・データベースにエクスポートして、Redgate SQL Compareなどのサード・パーティ・ツールを使用してスキーマを比較する方が簡単でしょう。

あなたが尋ねていることを行ったとしても、その目的はゼロからデータベースを作成することなので、展開にどのように役立つのか分かりません。

編集を追加する:スキーマは、いくつかの方法のいずれかを使用して展開されている場合は、それぞれのプラグインは、テーブルの独自のセットを持っていると仮定すると、あなたが決定することができる:プラグインオブジェクトの1つをロードし、キャッチする

  • 試み例外。
  • (SQL ServerのSMOを使用して)データベーススキーマを調べて、テーブルが存在するかどうかを確認します。
  • プラグインのデプロイ時にテーブルにレコードを作成します。
+1

アプリのデプロイメントの問題を解決しようとしていません。私は明確にするためにいくつかのメモを追加しました。お返事をありがとうございます! – Paul

+0

私は彼がデプロイ時には意味しないと思う...これは実行時または初期化時でなければならない...プラグインはそれ自身の依存関係の責任を負わなければならない。 – Webjedi

+0

ありがとうございます。私はあなたのものを「答えた」とマークしました。私は別の懸念を抱いていると思います。あなたの3番目の箇条書きで示唆するように、どのプラグインが配備されているかを追跡するのがおそらく最善のルートです。 – Paul

0

VS Team SuiteまたはDatabase Developer Editionをお持ちの場合は、変更を同期して追跡し、すべての適切なオブジェクトを作成する展開スクリプトを作成できます。また、RedGateには、私が間違っていなければ同じことをするSchema Compare製品があります。

+0

私はどちらのバージョンのVSも持っていませんが、開発者レベルでこれを管理しようとはしていません。その目的は、管理者がプラグインを追加/削除できるフィールド対応のアプリを構築することです。 – Paul

2

スキーマのエクスポートの目的は、最初から完全なスキーマを生成することです。まだアプリケーションをデプロイしていない場合は本当に便利です。

最初のデプロイメント後に、スキーマの拡張/変更に役立つ移行ツールを使用することを強くお勧めします。もう少し先に考えると、アプリケーションの進化に伴い、データ操作(バグのために生成された間違ったデータの削除など)が必要な場合もあります。これは、すべての移行ツールが役立つものです。

に見てみましょう:

ここ

.netのためのより多くの移行ツールのリストは、SOの質問に答えている:

原点移行のアイデアはRuby on Railsに由来しており、過去に他のフレームワークに「クローン」されています。だから、元のアイデアについてはhttp://guides.rubyonrails.org/migrations.htmlでも読んでも間違いない。

+0

私はSchemaExportとSchemaUpdateの違いを知っています。そのため、最初のスクリプトがすでに実行されているかどうかを検出できるようにしたかったのです。 – Paul

16

SchemaExportの代わりに、お探しのものがSchemaUpdate.Executeだと思います。 SchemaUpdateが存在しない場合はスキーマを作成するか、必要に応じて更新します。

これはMSSQLとSQLiteの両方を使用しています。

new SchemaUpdate(config).Execute(false, true); 
9

はい、更新部分について

public static bool ValidateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg); 
    try 
    { 
     myvalidator.Validate(); 
     myvalidator = null; 
     return true; 
    } 
    catch (Exception ex) 
    { 
     MsgBox(ex.Message, "Schema validation error"); 
    } 
    finally 
    { 
     myvalidator = null; 
    } 

    return false; 
} 

3.0少なくとも

で、やる、そこにあります。

public static void UpdateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg); 
    schema.Execute(false, true); 
    schema = null; 
} // UpdateSchema