NHibernate(またはFluent)でテーブルが存在するかどうかを確認するにはどうすればよいですか?
-
21-09-2019 - |
質問
NHibernate (または Fluent-NHibernate) にテーブルが存在するかどうかを確認するための最良かつ最も一貫性のある方法は何ですか?
それは可能ですか?つまり、これほど強力な ORM にとっては簡単な作業のように思えます。
また、関連する質問ですが、テーブルのセットまたはスキーマ全体が NHibernate に存在するかどうかを確認できますか?
解決
データベースに対して生成されたスキーマを検証することが可能です。
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
他のヒント
私はSchemaUpdateのソースコードに見えました。私は、SchemaUpdateが欠落しているテーブルを検出し、作成したスクリプトではなく、更新スクリプトを生成することができます知っていました。案の定、答えはそこにあった。
表がデータベースに存在しない場合、 GetTableMetadata
オブジェクト内NHibernate.Tool.hbm2ddl.DatabaseMetadata
関数はnullを返します。
通常、SchemaUpdateはDatabaseMetaDataオブジェクトを作成し、Configuration
オブジェクト内に通過します。しかし、それはあなたがDatabaseMetaDataのは、のDBConnectionと方言オブジェクトで作成するために必要なすべてのように見えます。
SchemaUpdateは以下のようなものをDatabaseMetaDataのを作成します:
connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
NHibernate.Cfg.Configuration
が、その後呼び出す
ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);
このような解決策を検索すると、Google のどこにでもこの質問と回答が表示されました。そのため、[質問が古かったため、追加の可能性が高く] 私にとって効果的なものをより正確かつ簡潔な方法でまとめておこうと思いました。」IsTable":
var configuration = Fluently.Configure()
.Database(MsSqlConfiguration
.MsSql2008
...
.BuildConfiguration();
var session = configuration.BuildSessionFactory().OpenSession();
DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
//TABLE_NAME e.g. "hibernate_unique_key"
if (meta.IsTable("TABLE_NAME"))
{
...
私はこれにつまずく前に上記と同様の複雑な戦略を実装したので、それが誰かに役立つことを願っています;)