2010-11-18 10 views
8

実際のアプリケーションでSchemaExportとSchemaUpdateを使用していますか?最初に、モデルを作成してからスキーマを生成しますか?それは動作しますか?または、テスト用にのみ使用してください...NHibernateとコードfirst

通常、私はdb(ビジュアルスタジオデータベースプロジェクトを使用)を作成し、次にデザイナを使用してマッピングと永続クラスまたはEFエンティティを作成します。しかし今、私はFluent NHibernateでコードの最初のアプローチを試してみたいと思います。

私はSchemaExportとSchemaUpdateを調査し、いくつかの問題を発見しました。たとえば、updateはdbオブジェクトを削除しません。テーブルが存在する場合はnullableなどのnullカラムを作成せず、多対多テーブルの主キーを生成しません。それは、非常に頻繁にDBを再作成する必要があることを意味します。しかし、データについてはどうですか?そして、プロダクションデータベースなどへの変更のデプロイ方法...

実際にコードを最初に使用し、アプリケーションでSchemaExport(SchemaUpdate)を使用していますか?あなたに私にいくつかの助言を与えることができるかもしれません...

答えて

8

私は生産でSchemaUpdateを使用します。列を削除するなどの破壊的操作は決して行われないため、安全です。ただし、データベースを更新するための包括的なソリューションではありません。あなたがそれを使用している場合は、削除(あなたが言及したように)、インデックス、カラムのタイプの変更、テーブルデータの追加などを行うためにあなたのスキーマを更新するスクリプトでそれを補う必要がありますが、SchemaUpdateは90%のケースをカバーします。

私が発見した唯一の欠点は、時折、テーブルに重複した外部キ​​ー制約が追加されているようだということです。

もう1つ:ビルドツールからSchemaUpdateを手動で実行する必要があります。アプリ自体は実行しないでください。 安全でないあなたのアプリケーションにdbスキーマを変更する権利を与える!

2

はい、これらは実際のアプリケーションで使用できます。私がやります。

もちろん、ほとんどすべての作業が最初に行われます。私のプラクティスは、メインプロジェクトアセンブリのマッピングを参照する別のプロジェクトを作成し、データベースの作成と初期データのインポート(存在する場合)を処理することでした。

プロジェクトが完成したら、私は通常そのプロジェクトをソリューションからアンロードしますが、参照用に、またはスクリプトの作成からスクリプトの更新に切り替える必要がある場合は、そのプロジェクトをアンロードしてください。

NHibernateがデータベースを作成する方法については、Fluentマッピングでは、そうでない場合よりも少し仕様を変更する必要があります。私はnull/not null、外部キー制約名などを指定して、データベースの作成方法を最大限に制御したいと考えています。

このシナリオでオートマトンを使用するとは思わないでしょう。

4

私はモデルの急速な進化のためにSchemaUpdate/SchemaExportを使用しますが、データベース移行ツールの代わりには使用できません。言及したように、多くの場合、データを賢明な方法で移行することはできません。ツールに十分なコンテキストがありません。 (例:どのように自動的にFullName列をFirstName/LastNameに移行できますか?)私はNHibernateのコンテキストでdb migrationツールについて議論しています。

NHibernate, ORM : how is refactoring handled? existing data?

1

ただ、それはあなたの質問のようなツールやデータベースの世代からPOCO世代を問わず任意の生成コードと、それはおそらくあなたが道の80%を取得します。そこから、インデックスを追加するために他の20%とそれを調整するのが賢明でしょう。

関連する問題