NHibernate は db スキーマが生成されたかどうかを確認できますか?
-
13-09-2019 - |
質問
それで、初心者の NHibernate ユーザーです。私の脳をそれに巻き込もうとしています。
デプロイメントと、その後の Web アプリへのアドオンの注入 (独自の永続クラスが必要になる場合があります) を処理する方法を検討しています。
を使って考えていたのですが、 SchemaExport
デプロイメントはかなりうまく機能するでしょうが、スキーマのエクスポートがすでに行われたかどうかを一般的なコードベースの方法で NHibernate に知らせる方法はないのかと疑問に思っていました。基本的に、この疑似コードのような処理を実行したいと思います。
if(!_cfg.HasSchemaForType(typeof(MyType))
ExportSchema(typeof(MyType));
else
UpdateSchema(typeof(MyType));
2 つの関数が内部で使用する場所 SchemaExport
または SchemaUpdate
, 、 それぞれ。
編集:皆さん、これまでの答えには感謝していますが、彼らは少し要点を見逃しています。私がセットアップしようとしているのは、データベースへの変更が必要となる可能性のあるアドオンの追加と削除をアプリケーションで可能にする方法です。私は自分自身のコードなどのバージョン管理について話しているのではありません (少なくとも、その主な機能としてではありません)。したがって、問題はアプリをいつデプロイするかということではなく、プラグインをいつ追加または削除するかということです。このプラグイン (したがって擬似コードの型チェック) は以前にデプロイされたことがありますか?その場合は、アップデートを実行してください。そうでない場合は、エクスポートを実行します。意味をなす?
解決
いいえ、Hibernate はあなたが求めていることをしません。スキーマをエクスポートしてデータベース スキーマと比較するコードを作成することは可能だと思います。ただし、一時データベースにエクスポートし、redgate SQL Compare などのサードパーティ ツールを使用してスキーマを比較する方がおそらく簡単です。
たとえそれがあなたが求めていることを実行したとしても、その目的はデータベースを最初から作成することであるため、それが展開にどのように役立つかわかりません。
編集して以下を追加しました:各プラグインに独自のテーブル セットがあると仮定すると、次のいくつかの方法のいずれかを使用して、スキーマがデプロイされているかどうかを確認できます。
- プラグイン オブジェクトの 1 つをロードして例外をキャッチしようとします。
- データベース スキーマを (SQL Server の SMO を使用して) 調べて、テーブルが存在するかどうかを確認します。
- プラグインのデプロイ時にテーブルにレコードを作成します。
他のヒント
私は、あなたが探しているものが代わりにSchemaUpdate.Execute
を使用してのSchemaExport
だと思います。 SchemaUpdate
は、それが存在しない場合は、スキーマを作成したり、必要に応じ、必要であれば、それを更新します。
MSSQLとの両方を使用して、私の作品のSQLiteます。
new SchemaUpdate(config).Execute(false, true);
はい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
スキーマ エクスポートの目的は、完全なスキーマを最初から生成することです。アプリケーションをまだデプロイしていない場合に非常に役立ちます。
最初のデプロイメントの後は、スキーマのさらなる拡張/変更に役立つ移行ツールを使用することを強くお勧めします。もう少し先のことを考えてみると、データ操作も必要であることに気づくでしょう (例:アプリケーションが進化するにつれて、バグにより生成された間違ったデータを削除します。移行ツールが役立つのはこれだけです。
以下を調べてください。
SO の質問で回答された、.net 用のその他の移行ツールのリストを次に示します。
移行の元のアイデアは Ruby on Rails から生まれ、過去に他のフレームワークに「クローン」されてきました。だからこそ、オリジナルのアイデアについては、次の URL で読むことをお勧めします。 http://guides.rubyonrails.org/migrations.html あまりにも。
あなたはVSチームSuiteまたはデータベース開発版を持っている場合は、それが同期して変更を追跡して、あなたのためのすべての権利オブジェクトを作成する展開スクリプトを作成することができます。また、レッドゲートは、私が間違っていない場合は、同じことをしてスキーマ比較製品を持っています。