NHibernate(またはFluent)でテーブルが存在するかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1557023

質問

NHibernate (または Fluent-NHibernate) にテーブルが存在するかどうかを確認するための最良かつ最も一貫性のある方法は何ですか?

それは可能ですか?つまり、これほど強力な ORM にとっては簡単な作業のように思えます。

また、関連する質問ですが、テーブルのセットまたはスキーマ全体が NHibernate に存在するかどうかを確認できますか?

役に立ちましたか?

解決

あなたがどこかにあなたの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"))
        {
        ...

私はこれにつまずく前に上記と同様の複雑な戦略を実装したので、それが誰かに役立つことを願っています;)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top