9

したがって、初心者のNHibernateユーザー。私の脳を包み込もうとしています。

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

デプロイメントに使用SchemaExportすることはかなりうまくいくと思っていましたが、NHibernateに、スキーマのエクスポートがすでに行われていることを一般的なコードベースの方法で教えてもらう方法があるかどうか疑問に思いました。基本的に、私はこの擬似コードのようにsmethingを実行したいと思います。

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

ここで、2つの関数はそれぞれ内部でSchemaExportまたはSchemaUpdateを使用します。


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

4

5 に答える 5

17

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

これは、MSSQLとSQLiteの両方を使用して私にとってはうまくいきます。

new SchemaUpdate(config).Execute(false, true);
于 2009-09-18T18:50:55.653 に答える
11

はい、少なくとも3.0ではあります

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;
}

更新部分については、実行してください。

public static void UpdateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
    schema.Execute(false, true);
    schema = null;
} // UpdateSchema
于 2010-10-31T11:44:24.040 に答える
3

いいえ、NHibernateはあなたが求めていることをしません。スキーマをエクスポートしてデータベーススキーマと比較するコードを作成することは可能だと思います。ただし、一時データベースにエクスポートし、redgateSQLCompareなどのサードパーティツールを使用してスキーマを比較する方がおそらく簡単です。

あなたが求めていることを実行したとしても、データベースを最初から作成することが目的であるため、それが展開にどのように役立つかはわかりません。

追加のために編集:各プラグインに独自のテーブルのセットがあると仮定すると、スキーマがいくつかの方法のいずれかを使用してデプロイされているかどうかを判断できます。

  • プラグインオブジェクトの1つをロードして、例外をキャッチしようとします。
  • (SMO for SQL Serverを使用して)データベーススキーマを調べて、テーブルが存在するかどうかを確認します。
  • プラグインがデプロイされたら、テーブルにレコードを作成します。
于 2009-06-15T19:39:57.613 に答える
2

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

最初の展開後、スキーマのさらなる拡張/変更に役立つ移行ツールを使用することを強くお勧めします。もう少し先を考えると、アプリケーションが進化するにつれて、データ操作(たとえば、バグのために生成された間違ったデータの削除)さえ必要であることに気付くでしょう。移行ツールが役立つのはこれだけです。

調べてみましょう:

SOの質問で回答された.net用のその他の移行ツールのリストは次のとおりです。

移行の元々のアイデアはRubyonRailsに端を発し、過去に他のフレームワークに「複製」されてきました。そのため、http: //guides.rubyonrails.org/migrations.htmlでも元のアイデアについて読むのは間違いなく良いことです。

于 2009-06-16T01:27:21.833 に答える
0

VS TeamSuiteまたはDatabaseDeveloperエディションを使用している場合は、変更を同期および追跡してから、適切なオブジェクトをすべて作成する展開スクリプトを作成できます。また、RedGateには、私が間違っていなければ同じことを行うスキーマ比較製品があります。

于 2009-06-15T19:43:10.163 に答える